Назначение области видимости среди jQuery.getJSON и JS.Class - PullRequest
1 голос
/ 24 февраля 2010

Я пытаюсь присвоить некоторые данные JSON свойству экземпляра JS.Class .

var MyClass = new JS.Class({
  initialize: function(uuid) {
      this.uuid = uuid;
  },
  write: function() {
    $.getJSON(url+"?callback=?", {}, function(data) {
      Assign(data);
    });
    function Assign(data) { this.content = data; };
  }
});

var m = new MyClass("uuid_goes_here");
m.write();

JSON принимается асинхронно, поэтому в обратном вызове $.getJSON есть вызов функции.

Проблема, с которой я столкнулся сейчас, заключается в том, что this.content в функции Assign не входит в область действия метода экземпляра с именем write. Так что, в то время как this.uuid возвращает правильно, this.content остается неопределенным (как и следовало ожидать).

Есть идеи, как это исправить? Я попытался использовать глобальную переменную в качестве обходного пути, но асинхронный вызов не позволяет этого (плюс это дурацкое решение).

Некоторые моменты, на которые следует обратить внимание, если они имеют значение: я должен использовать JSONP, поэтому «? Callback =?» должен остаться, и я хотел бы сохранить его асинхронным.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2010

Обычно я выбираю либо версию czarchaic, либо заменяю Accept на связанный метод объекта. Вы должны иметь в виду, что такой вызов Accept() (как вызов функции, а не вызов метода) будет связывать this с глобальным объектом, то есть window. Я бы попробовал это:

var MyClass = new JS.Class({
  initialize: function(uuid) {
      this.uuid = uuid;
  },
  write: function() {
    $.getJSON(url+"?callback=?", {}, this.method('setContent'));
  },
  setContent: function(data) {
    this.content = data;
  }
});

Подробнее см. http://jsclass.jcoglan.com/binding.html.

0 голосов
/ 24 февраля 2010

Вы должны кэшировать текущий экземпляр в методе записи и обновлять его после ajax.

write: function() {
  var self=this;
 $.getJSON(url+"?callback=?", {}, function(data) {
    self.data=data;
 });
}
...