Я пытался решить эту проблему без успеха. Я понимаю, что getCurrentPosition() возвращает обещание и вызывает $ scope.map.center в функции.then(). Я также понимаю, что $ 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
** Редактировать (Загруженное изображение консоли) **
Это то, что я вижу в консоли. Первым объектом является $ scope.map. Второй объект - $ scope.map.center
Функция then вызывается, когда getCurrentPosition завершена (она асинхронна) и отправляет данные обратно клиенту. Это единственное место, где вы можете надежно получить доступ к полученным им данным. Если вы выполняете асинхронные вызовы, вы должны использовать функцию 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
getCurrentPosition()
является асинхронным. Таким образом, ваши вызовы для журнала $scope.map
и $scope.map.center
просто вернут все, что вы изначально определили.
Данные будут установлены только в области, когда заканчивается вызов ajax.
$apply
чтобы убедиться, что изменения отражены в области видимости. stackoverflow.com/questions/23185619/...