我是棱角分明的,所以也许我错过了一些东西。
在我的注册表格中,我需要用户提供一个位置。根据他们是否允许/支持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 :(得分: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();
通过这种方法,您的代码很容易转移并且非常易读。同样少的线并不总是最好的方法。