Проблема класса и атрибута - PullRequest
       10

Проблема класса и атрибута

1 голос
/ 04 сентября 2011

Я хотел поиграть с API геолокации на моем Android. Я знаю, что существует объект "навигатор", который определен и должен использоваться для определения местоположения пользователя. Итак, я создал этот пример кода:

function GeolocationTester()
{
    // here I want to store all acquired locations
    this.locations = new Array();
    alert("this.locations defined: " + this.locations);
    this.onSuccess = function(position)
    {
        alert("Entered onSuccess");
        alert("this.locations defined: " + this.locations);
    }

    this.onError = function(error)
    {
        alert("error acquiring location");
    }
    navigator.geolocation.watchPosition(this.onSuccess, this.onError, { enableHighAccuracy: true });
}

И это не работает для меня. Каждый раз, когда watchPosition вызывает onSuccess, поле this.locations не определяется (и определяется сразу после нового массива). Я знал, что я делаю что-то неправильно, но так как это одна из моих попыток JavaScript, не уверен что. Итак, кто-нибудь может найти здесь проблему?

Ответы [ 3 ]

3 голосов
/ 04 сентября 2011

Проблема с областью действия this. Когда вызывается onSuccess или onError, this не привязывается к объекту, содержащему массив locations. Вам необходимо создать явную переменную вне функций, которым должен быть назначен массив, а затем использовать эту переменную в обратных вызовах, например:

var allLocations = this.locations = [a, b, c];
this.onSuccess = function(position) {
    alert("allLocations: " + allLocations);
    alert("this.locations: " + this.locations);
}
2 голосов
/ 04 сентября 2011

Это потому, что вы используете this. Это изменится, потому что это зависит от контекста, который вызывает ваша функция. Просто используйте область действия функции, чтобы объявить местоположение:

function GeolocationTester()
{
    // here I want to store all acquired locations
    var locations = [];
    alert("locations defined: " + locations);

    function onSuccess(position)    {
        alert("Entered onSuccess");
        alert("locations defined: " + locations);
    }

   function onError(error){
        alert("error acquiring location");
   }


 navigator.geolocation.watchPosition(onSuccess, onError, { enableHighAccuracy: true });
}

Чтобы действительно понять, что this прочитайте эту запись в блоге http://dmitrysoshnikov.com/ecmascript/chapter-3-this/

0 голосов
/ 04 сентября 2011

Попробуйте определить onSuccess так:

this.onSuccess = (function(locations) {
    return function(position)
           {
               alert("Entered onSuccess");
               alert("this.locations defined: " + locations);
           }
})(this.locations);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...