2009-06-16 4 views
0

Я отредактировал рабочий код для использования правильных объектов, и теперь я не могу заставить AJAX.Request Prototype работать правильно. Код ниже, он работает в контексте DataTable Юи:Использование собственных методов обратного вызова для запроса AJAX в Prototype

SearchTable.prototype.setTableColumns = function (transport) { 
     this.dataTableColumns = transport.responseText.evalJSON(); 
     this.dataTableCallback(); 
}; 

SearchTable.prototype.setTableConfiguration = function (transport) { 
    this.dataTableConfiguration = transport.responseText.evalJSON(); 
    this.dataTableCallback(); 
}; 

SearchTable.prototype.show = function() { 
    .... 
    new Ajax.Request(this.dataProxy, { 
    method: 'get', 
    parameters: { 
     format: 'json', 
     param: 'columns' 
    }, 
    onSuccess: this.setTableColumns 
    }); 

new Ajax.Request(this.dataProxy, { 
    method: 'get', 
    parameters: { 
    format: 'json', 
    param: 'configuration' 
    }, 
    onSuccess: this.setTableConfiguration 
    }); 
} 
}; 

SearchTable.prototype.dataTableCallback = function() { 
     .... 
} 

Моя проблема заключается в том, что dataTableCallback никогда не вызывается. По-видимому, это исключает исключение , которое я могу понять: обратные вызовы не вызываются в контексте объекта, и поэтому this никогда не назначается. Я пробовал curryfying callbacks, но не смог.

Вопрос в следующем: как я могу это сделать?

ответ

2

Создать замыкание на "это":

SearchTable.prototype.show = function() { 
    .... 

    var self = this; 

    new Ajax.Request(this.dataProxy, { 
    method: 'get', 
    parameters: { 
     format: 'json', 
     param: 'columns' 
    }, 
    onSuccess: function(transport) { self.setTableColumns(transport); } 
    }); 
+0

Спасибо, присваивание 'this' чему-то другому было ключом. –

+0

Тем не менее, сочетание как вашего, так и решения Cédric является лучшим. –

+0

Тем не менее, я думаю, что вам не нужно назначать это чему-то еще в этом примере. Поскольку setTableColumn вызывается как метод * этого *, * это * устанавливается в его теле. Это то же самое, что использовать bind(), но немного меньше прототипа-иш :) – Alsciende

4

Попробуйте это:

onSuccess: this.setTableColumns.bind(this) 
+0

является 'transport' переменного еще доступен? – pstanton

+0

Да, это первый аргумент setTableColums. – Sander

Смежные вопросы