Angularjs ng-show基于回调

时间:2012-12-29 19:00:16

标签: javascript angularjs

我是棱角分明的,所以也许我错过了一些东西。

在我的注册表格中,我需要用户提供一个位置。根据他们是否允许/支持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>

这种方法对我不起作用。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:14)

每当你在angularjs之外进行某种形式的操作时,例如用jquery进行ajax调用,或者像你的例子一样抓住地理位置,你需要让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.$rootScope.Scope#$apply

的文档

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

修改:我的回答已修改,但我不同意修改。虽然您可以将$ apply方法包装在$ scope.showLoc = false周围,以使其更短&#34;你真的只保存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;
});

或直接在需要&#34;应用&#34;:

的代码之后
$scope.var1 = newValue1;
$scope.var2 = newValue2;
$scope.var3 = newValue3;
$scope.$apply();

通过这种方法,您的代码很容易转移并且非常易读。同样少的线并不总是最好的方法。