Объявите объект JavaScript.Затем установите свойства с помощью jQuery и Ajax - PullRequest
1 голос
/ 27 ноября 2011

Я не могу получить доступ к атрибуту экземпляра класса. Атрибут устанавливается с помощью вызова AJAX.

Я пытаюсь определить класс «CurrentUser», а затем установить атрибут «userId» с помощью AJAX.


Здесь я определяю класс CurrentUser и присваиваю ему атрибут userID:

function CurrentUser() {
    // Do an ajax call to the server and get session data.
    $.get("../../build/ajaxes/account/get_user_object_data.php", function(data) {
         this.userId = data.userId;
         console.log(data.userId);   // This will correctly output "1".
    }, "JSON");
}


Здесь я создаю экземпляр CurrentUser с именем billybob. Обратите внимание, что я не могу вывести атрибут billybob:

// Instantiate the user. 
   var billybob = new CurrentUser();
   console.log(billybob.userId);     // This will incorrectly ouput "undefined".



Я проверил распространенные ошибки с AJAX:

  • Вызов AJAX возвращает данные правильно как объект JSON. Я могу прочитать правильный объект в Firebug / Сетевой консоли. Вызов AJAX также имеет статус «200» и «ОК».

  • Я могу правильно записывать данные вызова AJAX, как видно из первой части моего кода, где я регистрирую data.userId.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Может быть, это проясняет:

В исходном коде:

function CurrentUser() {
    // Do an ajax call to the server and get session data.
    $.get("../../build/ajaxes/account/get_user_object_data.php", function(data) {
     this.userId = data.userId;
     console.log(data.userId);   // This will correctly output "1".
    }, "JSON");
}

Вы создаете анонимную функцию на лету, которая позже будет вызываться внутренними компонентами jQuery с this установить объект AJAX. Таким образом, this будет объектом ajax внутри анонимной функции, а не billybob. Так когда you do this.userId = ... this означает объект ajax, у которого нет свойства userid.

jQuery не будет знать, откуда вы взяли функцию обратного вызова, поэтому он не может автоматически установить this для вас.

Что вам нужно сделать, это сохранить ссылку billybob (или любой экземпляр CurrentUser) и использовать ее в обратном вызове следующим образом:

function CurrentUser() {
var self = this;
    $.get("../../build/ajaxes/account/get_user_object_data.php", function(data) {
     self.userId = data.userId; //self refers to what this refered to earlier. I.E. billybob.
     console.log(data.userId, self.userid);   // This will correctly output "1".
    }, "JSON");
}

Также обратите внимание, что:

 var billybob = new CurrentUser();
   console.log(billybob.userId);   

К тому времени, когда вы звоните console.log (т.е. сразу после создания billybob), запрос ajax еще не был выполнен, поэтому он undefined.

0 голосов
/ 27 ноября 2011

В конструкторе рассмотрим выполнение

var self = this;

, а в функции

self.userId = data.userId;

this внутренняя функция будет отличаться от внешней.Хотя я не знаю JQuery.Может быть, он должен автоматически настроить закрытие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...