Javascript $scope在嵌套函数中不可访问
我正在尝试在angularjs中构建一个地理定位服务,但是我想先在我的控制器中尝试一下,然后将其移出。现在,当我获取position.coords.latitude/longitude值时,我无法访问$scope变量 有人能给我解释一下为什么它无法访问吗?我对javascript没有深入的了解,但这是因为父变量由于某种原因无法访问吗?那么,有什么好方法可以绕过这种限制呢 我也在为这个javascript添加标签,因为我不确定这是语言设计的特点,还是因为我是盲人而遗漏了什么 我确实看到控制台上的横向/纵向打印,因此我知道我得到的是有效数据Javascript $scope在嵌套函数中不可访问,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在尝试在angularjs中构建一个地理定位服务,但是我想先在我的控制器中尝试一下,然后将其移出。现在,当我获取position.coords.latitude/longitude值时,我无法访问$scope变量 有人能给我解释一下为什么它无法访问吗?我对javascript没有深入的了解,但这是因为父变量由于某种原因无法访问吗?那么,有什么好方法可以绕过这种限制呢 我也在为这个javascript添加标签,因为我不确定这是语言设计的特点,还是因为我是盲人而遗漏了什么 我确实看到控制台上的横
//geolocation.js
angular.module('myapp', [])
.controller('MyController', ['$scope',
function($scope) {
if ("geolocation" in navigator) {
var watchID = navigator.geolocation.watchPosition(function(position) {
$scope.latitude = position.coords.latitude;
$scope.longitude = position.coords.longitude;
console.log($scope.latitude);
console.log($scope.longitude);
}, function() {}, {
enableHighAccuracy: true,
maximumAge: 30000,
timeout: 27000
});
} else {
/* geolocation IS NOT available */
}
}
]);
及
//index.html
你好
{{纬度}}
{{经度}}
好吧,我又加了一句
$scope.$apply($scope.latitude)
就在console.log之后,但仍在函数中
纬度和经度都会更新。我只尝试了一个普通的$scope。$apply();但那没用。我想这是第一种方式,所以我会坚持下去
我已经更新到$scope.coords=position.coords,现在是$scope.apply($scope.coords)
在html中,我正在做{{coords.latitude}}和经度等,它工作得很好
对任何感兴趣的人。此外,我还计划转向一项服务,但不确定这项服务的效果如何。好的,首先猜测,在设置标量值时,您正在使用角度范围的原型链进行臭名昭著的/令人讨厌的攻击。许多人对此感到惊讶,事实确实如此。尝试重构代码,使
$scope.coords
成为具有嵌套子属性$scope.coords.latitude
和$scope.coords.longitude
的对象(对修复至关重要)。可能发生的情况是,您的子作用域正在跟踪标量纬度
属性,因此父作用域无法访问/查看它。您看到值打印到控制台,因此您知道您实际上正在访问$scope
变量。你只是碰巧没有看到HTML中的变化,对吗?您没有看到这些更改,因为angular没有意识到范围正在更改。简单的回答是,您需要使用$apply
包装对作用域的更改,以让angular知道它们正在被更改
这里有一个相关的答案,您可能会发现它很有用:我最初尝试了$scope.coords={“latitude”:position.coords.latitude,“longitude”:position.coords.longitude}但这不起作用,但应用程序确实起作用。你认为这个建议仍然有效吗?我以前没有见过这个链接,所以很高兴知道。不,在这种情况下,公认的答案是正确的。我没有注意到你在进行地理定位时绕过了angular。不过,我所描述的问题值得注意,在处理嵌套范围时,您可以通过“2点规则”完全避免它,以确保子范围中的更改对父范围可见。
//index.html
<!doctype html>
<html ng-app="myapp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.js">
</script>
<script src="geolocation.js">
</script>
</head>
<body ng-controller="MyController">
Hello
<div>
<p>{{latitude}}</p>
<p>{{longitude}}</p>
</div>
</body>
</html>