AngularJS:访问嵌套在 $scope 中的对象

Posted

技术标签:

【中文标题】AngularJS:访问嵌套在 $scope 中的对象【英文标题】:AngularJS: Accessing an object nested within $scope 【发布时间】:2016-05-31 22:40:35 【问题描述】:

我一直在尝试解决这个问题,但没有成功。我知道 getCurrentPosition() 返回一个承诺并在 .then() 函数中调用 $scope.map.center 将起作用。我也明白 $scope 在摘要循环中运行,并且它的属性和对象在承诺解决时更新。我对这一切都很陌生,我希望我是有道理的。

也就是说,我很想了解发生了什么,因为 console.log($scope.map) 按预期工作, map.center 按预期显示,但 console.log(map.center) 返回.then() 函数之外的空对象。

提前感谢您的帮助!

    $scope.map = 
            control: ,
            center: ,
            zoom: 16
        ;

    $geolocation.getCurrentPosition(
        timeout: 60000,
        maximumAge: 250,
        enableHighAccuracy: true
    ).then(function(position) 
        $scope.map.center.latitude = position.coords.latitude;
        $scope.map.center.longitude = position.coords.longitude;
    );


    //Output
    
    console.log($scope.map); //returns full object including data within $scope.map.center

    console.log($scope.map.center); //returns an empty object. I am looking to convert this to an array using lodash. 
  map.center   works fine and returns the coordinates of my current location

**编辑(上传的控制台图像)**

This is what I see in the console. First object is $scope.map Second object is $scope.map.center

【问题讨论】:

【参考方案1】:

当 getCurrentPosition 完成时调用 then 函数(它是异步的)并将数据发送回客户端。这是您可以可靠地访问由它检索到的数据的唯一地方。如果要进行异步调用,则必须使用 then 函数来访问数据。 THEN 是调用后发生的事情。 then(函数外部)之后的代码在调用 getCurrentPosition 后立即执行,而不是在它完成时执行。

如果你只是想找一个不同的地方来放置这段代码,你可以在 then 函数之外调用另一个函数并将位置对象传递给它。

$scope.map = 
        control: ,
        center: ,
        zoom: 16
    ;

$geolocation.getCurrentPosition(
    timeout: 60000,
    maximumAge: 250,
    enableHighAccuracy: true
).then( processMap(position))

function processMap(position) 
    $scope.map.center.latitude = position.coords.latitude;
    $scope.map.center.longitude = position.coords.longitude;
    console.log($scope.map); 
    console.log($scope.map.center); 
;

如果您正在寻找有关异步调用的更多信息,请参阅以下说明:

http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls

【讨论】:

感谢您的详细解答!如果我在您的解释中遗漏了它,请原谅我,但我想知道为什么 $scope.map 首先起作用。 它要么真的没有,你只是得到你在控制器函数顶部创建的对象,要么调用可能部分完成。 在做了更多检查之后,我现在认为这与 html5 Geolocation 返回一个称为坐标的特殊对象类型有关。这将满足我现在的好奇心。但是,我可能错了。【参考方案2】:

getCurrentPosition() 调用是异步的。因此,您对记录 $scope.map$scope.map.center 的调用只会返回您最初定义的任何内容。

只有 ajax 调用结束时,才会在作用域内设置数据。

【讨论】:

您说他们都应该返回我最初定义的内容。我对记录 $scope.map 的调用返回了完整的对象(包括保存在 $scope.map['center'] 中的坐标)。另一方面,我对 $scope.map.center 的调用返回了一个空对象。这就是困扰我的地方。如果两个都返回空对象,我会很好。 @nubianrover 看起来您还需要致电$apply 以确保更改反映在范围中。 ***.com/questions/23185619/…

以上是关于AngularJS:访问嵌套在 $scope 中的对象的主要内容,如果未能解决你的问题,请参考以下文章

angularjs 中的scope继承关系——

AngularJs一些记录

如何在 angularjs ui-router 中的状态之间共享 $scope 数据?

如何在angularjs ui-router中的状态之间共享$ scope数据?

深究AngularJS——Directive和Scope数据隔离与交互

如何使用AngularJS在浏览器控制台中访问$ scope变量?