Использование `this` в объекте js - PullRequest
1 голос
/ 29 марта 2011

У меня есть следующий объект js:

var livePage = {
    delay: 1000,
    loadTables: function(){
        loadTable($("#vbeTable"),'getUpdateA')
        loadTable($("#vbcTable"),'getUpdateB')
        createAlertDialog();
    },
    setClicks: function(){
        $(".expand").live('click',function(){
            expand($(this).attr('expandvalue'));
        })
        $( ".launch" )
            .click(function(){
                newPopup('index.php',1120,550);
            });
        $('.edit').live('click',function(){
            openColPick($(this).attr('colType'))
        });
    },
    setRightClick: function(){
        $('body').contextMenu('mainmenu', {
              bindings: {
                'o_o': function(t) {
                  thePopupWindowsMain('oo','','',220,150,'right','');
                },
                'o_h': function(t) {
                  thePopupWindowsMain('oh','','',285,385,'left','');
                },
                'launch_prog': function(t) {
                  $(".launch").click();
                },
                'logout': function(t){
                    window.top.location = 'logout.php';
                }
              }
            });
    },
    setWindow: function(){
        $(window)
            .resize(function() {
                $('body').css('height', $(this).height())
                alertToCorner();
            })
            .scroll(function(){$(this).resize()});
        $(window).resize();
    },
    checkLogout: function(){
        $.ajax({
            url: 'getLogin.php',
            dataType: "html",
            success: function(data){
                if($.trim(data) == 'LOGOUT'){
                    window.location = 'logout.php';
                }
            },
            complete: function(){
                setTimeout( function () {
                    livePage.checkLogout();},
                livePage.delay)
            },
            timeout: 2000
        });
    },
    init: function(){
        this.checkLogout();
        this.loadTables();
        this.setClicks();
        this.setRightClick();
        this.setWindow();
        console.log(this);
    }
}

По какой-то причине в checkLogout: function() мне приходится использовать livePage.delay и livePage.checkLogout() Когда я пытаюсь использовать, например, this.checklogout(), я получаю следующую ошибку в консоли Chrome:

Uncaught TypeError: Object [object DOMWindow] не имеет метода 'checkLogout'

Как мне это исправить?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 29 марта 2011

Внутри функции this больше не связан с тем, с чем он был связан снаружи.Самое простое решение - присвоить другую переменную, используя var self = this;, или в вашем случае передать ее с помощью опции context: this, равной $.ajax().

3 голосов
/ 29 марта 2011

Можно попробовать,

 checkLogout: function(){
        var self = this; //reference to the livePage object
        $.ajax({
            url: 'getLogin.php',
            dataType: "html",
            success: function(data){
                if($.trim(data) == 'LOGOUT'){
                    window.location = 'logout.php';
                }
            },
            complete: function(){
                setTimeout( function () {
                    self.checkLogout();},  //need to use self because 'this' no longer refers to livePage in this context
                livePage.delay)
            },
            timeout: 2000
        });
    }
1 голос
/ 29 марта 2011

this значительно отличается в js, чем в таких языках, как C #.Во-первых, это функциональная область.Во-вторых (и, возможно, более важно), вы можете контролировать, что будет this при вызове функции.(Обратите внимание на функции «call» и «apply», которые довольно часто используются в инфраструктурах javascript.)

0 голосов
/ 29 марта 2011

Вы должны добавить свойство context: this к хешу, который вы отправляете на $.ajax, а затем при полном вызове обработчика this.checkLogout.

Что происходит, если метод ajax JQuery вызоветобработчики, использующие window в качестве контекста this, мы можем изменить это, добавив свойство context к вызову.

0 голосов
/ 29 марта 2011

Прочтите это ключевое слово в Javascript. В вашем случае this относится к окну, которое, как говорит ошибка, не имеет метода 'checkLogout'.

...