Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Применение библиотек > Prototype. Ajax.Request и this.


Автор: SamDark 23.6.2007, 12:34
Есть вот такой код:

Код

MyObj = function(){
  this.items = new Array();
}

MyObj.prototype.process = function(id){
    new Ajax.Request('/loader?id='+id, {
        method: 'get',
        onSuccess:function(resp) {
            eval("var items = " + resp.responseText + ";");
                                    // естественно, не работает, а хочется...
            this.items = items;
        },
        onFailure:function(resp){alert(resp.responseText);}
    });    
}


Надо как-то вытащить переменную items из области видимости Ajax.Request. Как это сделать?

Автор: Alx 23.6.2007, 14:36
SamDark

Код

MyObj = function(){
  this.items = new Array();
}

MyObj.prototype.process = function(id){
    var t = this; // обозначаем через внутреннюю переменную
    new Ajax.Request('/loader?id='+id, {
        method: 'get',
        onSuccess:function(resp) {
            var items = eval(resp.responseText);
                                    // конечно, this уже ссылается на функцию onSuccess...
            t.items = items;
        },
        onFailure:function(resp){alert(resp.responseText);}
    });    
}

Автор: SamDark 23.6.2007, 14:57
Alx
Спасибо.

Автор: Avb 25.6.2007, 12:46
Для того чтобы внутри функции указатель this ссылался на нужный объект в prototype.js существуют методы bind() и bindAsEventListener(). Последний еще и передает первым параметром объект event.
Код

MyObj = function(){
  this.items = new Array();
}

MyObj.prototype.process = function(id){
    new Ajax.Request('/loader?id='+id, {
        method: 'get',
        onSuccess:function(resp) {
            eval("var items = " + resp.responseText + ";");
                                    
            this.items = items;
        }.bind(this),  // здесь this указывает на MyObj. 
                             // С помощью bind() this внутри onSuccess также будет ссылаться на MyObj
        onFailure:function(resp){alert(resp.responseText);}
    });    

}

Автор: SamDark 25.6.2007, 13:09
Avb
Спасибо, учту.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)