AngularJS: доступ к объекту, вложенному в $ scope

0

Я пытался решить эту проблему без успеха. Я понимаю, что 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

Теги:
angularjs-scope

2 ответа

0
Лучший ответ

Функция 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

  • 0
    Спасибо за подробный ответ! Простите, если я пропустил это в вашем объяснении, но мне интересно, почему $ scope.map сработал в первую очередь.
  • 0
    Это или нет, и вы только что получили объект, который создали в верхней части вашей функции контроллера, или возможно, что вызов был частично завершен.
Показать ещё 1 комментарий
0

getCurrentPosition() является асинхронным. Таким образом, ваши вызовы для журнала $scope.map и $scope.map.center просто вернут все, что вы изначально определили.

Данные будут установлены только в области, когда заканчивается вызов ajax.

  • 0
    Вы сказали, что они должны вернуть то, что я изначально определил для них. Мой вызов log $ scope.map вернул полный объект (включая координаты, сохраненные в $ scope.map ['center']). С другой стороны, мой вызов $ scope.map.center вернул пустой объект. Вот что меня беспокоит. Мне было бы хорошо, если бы оба возвращали пустые объекты.
  • 0
    @nubianrover Похоже, вам также нужно вызвать $apply чтобы убедиться, что изменения отражены в области видимости. stackoverflow.com/questions/23185619/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню