2016-05-31 61 views
0

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

这就是说,我完全喜欢了解发生了什么,因为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

回答

0

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

如果您只是寻找不同的地方来放置此代码,您可以调用另一个函数以外的函数,并将位置对象传递给它。

$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); 
}; 

如果您正在寻找有关asynchonous呼叫的详细信息,请参阅这样的解释:

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

+0

感谢您的详细解答!原谅我,如果我错过了你的解释,但我想知道为什么$ scope.map首先工作。 – nubianrover

+0

它不是真的没有,你只是得到你在控制器功能顶部创建的对象,或者可能部分完成了调用。 –

+0

在做了一些更多的检查之后,我现在认为它与HTML5地理位置返回称为坐标的特殊对象类型有关。这会满足我现在的好奇心。但是,那么我可能是错的。 – nubianrover

0

getCurrentPosition()呼叫是异步的。所以你的电话登录$scope.map$scope.map.center只会返回你最初定义它们的东西。

数据将只在ajax调用完成时设置在范围内。

+0

你说他们都应该回到我最初所定义的那样。我对log $ scope.map的调用返回了完整的对象(包括保存在$ scope.map ['center']中的坐标)。另一方面,我对$ scope.map.center的调用返回了一个空对象。这就是困扰我的东西。如果两个都返回空对象,我会很好。 – nubianrover

+0

@nubianrover看起来您还需要调用''apply'''来确保所做的更改反映在范围中。 http://stackoverflow.com/questions/23185619/how-can-i-use-html5-geolocation-in-angularjs – jtmingus