Показать сообщение отдельно
  #1 (permalink)  
Старый 09.07.2009, 11:27
AntonE
 
Сообщений: n/a

Проблема с this
Добрый день.
В общем, сейчас изучаю GMap API и возникла проблема.
Gmap я указал на всякий случай, знание его необязательно, чтобы помочь мне, главное - это javascript.

Gmap предоставляет метод GDownloadUrl(имя_файла, колбек)
Выглядит это примерно так
GDownloadUrl("data.xml", function(data, responseCode) {
//какой-нибудь код
});

Вот мой код
function Streets() {
      this.map = new GMap2(document.getElementById("map_canvas"));
      this.init();
      // temp - просто переменная для проверки.
      this.temp = 'ok';
      this.load();
    }
    Streets.prototype = {
      init: function() {
        this.map.setCenter(new GLatLng(51.6538, 30.1749), 12);
        this.map.addControl(new GLargeMapControl());
        this.map.addControl(new GMapTypeControl());
      },
      load: function() {
        GDownloadUrl("data.xml", this.parseXML);
      },
      parseXML: function(data, responseCode) {
        // что-нибудь делаем
      }
    };

В моем методе load вызывает гуглевский метод GDownloadUrl, который просто загружает файл data.xml и запускает колбек, которому передает 2 параметра - nodelist и номер статуса.
Я хочу, чтобы колбек вызывал Streets.parseXML и передал ему параметры. Но это у меня пока не получается.
Если я делаю так:
load: function() {
        GDownloadUrl("data.xml", this.parseXML);
      },
      parseXML: function(data, responseCode) {
        alert(this.temp); // undefined, "потеряли" this
        alert(arguments.length); // все хорошо - 2 аргумента.
      }


если так:
load: function() {
        GDownloadUrl("data.xml", this.parseXML.call(this));
      },
      parseXML: function(data, responseCode) {
        alert(this.temp); // результат - ok
        alert(arguments.length); // результат - 0, параметры не передались
      }


если так:
// Так вообще не работает.
      load: function() {
        GDownloadUrl("data.xml", this.parseXML.call(this, data, responseCode));
      },
      parseXML: function(data, responseCode) {
        alert(this.temp);
        alert(arguments.length);
      }


Если так:
load: function() {
        GDownloadUrl("data.xml", this.parseXML.call(this, arguments[0], arguments[1]));
      },
      parseXML: function(data, responseCode) {
        alert(this.temp); // Результат - ок
        alert(arguments.length); // 2 аргумента
        alert(responseCode); // но оба undefined
      }


если так:
load: function() {
        GDownloadUrl("data.xml", function(data, responseCode) {
          // this здесь не указывает на Streets, т.е.
          // вызвать отсюда this.parseXML не получается.
          // Может есть способ?
        });
      },
      parseXML: function(data, responseCode) {
        //...
      }


Подскажите, пожалуйста, как же все-таки вызвать parseXML, чтобы this ссылался на Streets и аргументы были бы "на месте".
Ответить с цитированием