this.function не является ошибкой функции, но функция существует - PullRequest
3 голосов
/ 13 февраля 2012

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

var calendar = {

    events = null,

    display_calendar_events : function (data) {
        // Some display stuff...
    },

    get_events: function() {

        // Get messages for calendar
        $.getJSON("/ajax/get-events/", function(json){

            var new_events = json.data;
            // If events haven't changed, do nothing
            if (this.events === new_events) {
                return true;
            }

            // Events have changed. 
            // Save new events
            this.events = new_events;

            // Display new events
            this.display_calendar_events(json);
        });
   },
}

Я вызываю это с помощью:

calendar.get_queued_events();

Проблема в том, что я получаю ошибку "this.display_calendar_events не является функцией" (последняя строка кода).Но если я изменю эту строку на:

calendar.display_canendar_events(josn)

, это сработает.Хранение старых событий с помощью this.events работает в обоих случаях нормально.

Может кто-нибудь объяснить мне это?Как «это» может работать для одних вещей, а не для других?Спасибо.

Ответы [ 2 ]

8 голосов
/ 13 февраля 2012

В обратном вызове jQuery AJAX this ссылается на объект запроса ajax. Попробуйте использовать var self = this; перед вызовом AJAX, а в обратном вызове используйте self.display_calendar_events().

В качестве альтернативы, вы можете просто ссылаться на calendar.display_calendar_events() напрямую. Но это не так легко изменить, как метод self.

1 голос
/ 13 февраля 2012

Когда вы вызываете this.display_calendar_events () внутри ajax-запроса, вы размещаете его в другом контексте, отличном от вашего объекта. Вы должны сделать:

var calendar = {

events = null,

display_calendar_events : function (data) {
    // Some display stuff...
},

get_events: function() {
    var $this = this; 
    // Get messages for calendar
    $.getJSON("/ajax/get-events/", function(json){

        var new_events = json.data;
        // If events haven't changed, do nothing
        if ($this.events === new_events) {
            return true;
        }

        // Events have changed. 
        // Save new events
        $this.events = new_events;

        // Display new events
        $this.display_calendar_events(json);
    });

   },

}
...