Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $scope在嵌套函数中不可访问_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript $scope在嵌套函数中不可访问

Javascript $scope在嵌套函数中不可访问,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在尝试在angularjs中构建一个地理定位服务,但是我想先在我的控制器中尝试一下,然后将其移出。现在,当我获取position.coords.latitude/longitude值时,我无法访问$scope变量 有人能给我解释一下为什么它无法访问吗?我对javascript没有深入的了解,但这是因为父变量由于某种原因无法访问吗?那么,有什么好方法可以绕过这种限制呢 我也在为这个javascript添加标签,因为我不确定这是语言设计的特点,还是因为我是盲人而遗漏了什么 我确实看到控制台上的横

我正在尝试在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>