2012-12-29 12 views
8

私は角度が新しくて多分私は何かを見逃しています。コールバックに基づくAngularjs ng-show

私の登録フォームには、ユーザーの所在地が必要です。彼らがnavigator.geolocationを許可/サポートしているかどうかに基づいて、ドロップダウンを表示して場所を選択します。

コントローラ。

$scope.showLoc = true; 
if(navigator && navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(function(pos){ 
     $scope.showLoc = false; 
    },function(err){ 
     $scope.showLoc = true; 
    }); 
} 

と私形式:

<form class="form-horizontal" name="register" ng-controller="RegisterCtrl" ng-submit="registerUser()"> .... 
<div ng-show="showLoc" accesskey=""> 
    test 
</div> 
.... 
</form> 

このアプローチは、私のために働いていません。どんな洞察にも感謝します。

+0

すばやく見ると、私はこれに間違ったことは何も見えません。 http://jsfiddle.netを作成できますか? – Dogbert

+0

フォームのどこかに(例えば、 ''の終わりの直前に)、{{showLoc}}を入れて、scopeプロパティがあなたが期待する値に設定されているかどうかを確認してください。 –

+0

作成済みjsFiddle http://jsfiddle.net/yLFNP/ – Maleck13

答えて

14

jqueryを使用してajax呼び出しを行うなど、anglejs以外の操作を行う場合や、ここでの例のようにジオロケーションを取得する場合は、角度を更新する必要があります。私はあなたのjsfiddleを見て、このように見て周り、あなたのコードの一部を変更:

var app = angular.module('myApp', []); 
app.controller('RegisterCtrl',function($scope){ 
    $scope.showLoc = false; 
    navigator.geolocation.getCurrentPosition(function(pos){ 
      $scope.showLoc = true; 
      $scope.$apply(); 
     },function(err){   
      $scope.showLoc = false; 
      $scope.$apply();    
     }); 
}); 

そして今showLocは、更新時にtrueに変更します。ここで$が適用されます使用上のdocumationだ()メソッドhttp://docs.angularjs.org/api/ng.$rootScope.Scope#$apply

jsFiddlehttp://jsfiddle.net/yLFNP/6/

編集:私の答えは編集されたが、私は編集に同意しません。あなたは$ scope.showLoc = falseの周りに$ applyメソッドをラップして "短く"することができますが、実際には1文字(セミコロン)しか保存しません。また、私は、その中にすべてをラップするのではなく、一束のロジックの後に$ applyメソッドを好む傾向があります。私はスコープにやっていた以上のものがあった場合は、そのような追加の各1を書く必要があるだろう、次のいずれか

私はやり過ぎ見つける
$scope.$apply($scope.var1 = newValue1); 
$scope.$apply($scope.var2 = newValue2); 
$scope.$apply($scope.var2 = newValue3); 

、またはあなたが関数法使用できます。

$scope.$apply(function(){ 
    $scope.var1 = newValue1; 
    $scope.var2 = newValue2; 
    $scope.var3 = newValue3; 
}); 

直接必要のあるコードの後に​​「適用」:

$scope.var1 = newValue1; 
$scope.var2 = newValue2; 
$scope.var3 = newValue3; 
$scope.$apply(); 

をこの方法ですべての時間をそれを行うことで、コードが簡単に譲渡し、非常に読みやすいですね。また、常に最善の方法であるとは限りません。

関連する問題