8

私は角度が初めてなので、何かが足りないかもしれません。

私の登録フォームでは、ユーザーからの場所が必要です。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>

このアプローチは私にはうまくいきません。任意の洞察をいただければ幸いです。

4

1 に答える 1

14

jquery を使用して ajax 呼び出しを実行したり、ここでの例のように位置情報を取得したりするなど、angularjs の外部でなんらかの形式の操作を行うときはいつでも、angular に自身を更新するように知らせる必要があります。私はあなたの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 に変わります。$apply() メソッドの使用に関するドキュメントは次のとおりですhttp://docs.angularjs.org/api/ng.$ro ​​otScope.Scope#$apply

jsFiddle http://jsfiddle.net/yLFNP/6/

編集:私の回答は編集されましたが、編集に同意しません。$apply メソッドを $scope.showLoc = false にラップして「短く」することもできますが、実際には 1 文字 (セミコロン) しか保存していません。また、私は $apply メソッドですべてをラップするのではなく、一連のロジックの後にする傾向があります。スコープに対してさらに多くのことを行っていた場合は、次のように追加ごとに記述する必要があります。

$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();

この方法を常に実行することで、コードは簡単に転送でき、非常に読みやすくなります。また、行数を減らすことが常に最善の方法であるとは限りません。

于 2012-12-29T21:02:19.677 に答える