2009-06-16 8 views
0

verwenden Ich habe Arbeitscode umgebildet, um richtige Objekte zu verwenden, und jetzt kann ich AJAX.Request von Prototype nicht ordnungsgemäß ausführen. Der Code ist unten, es ist in Zusammenhang mit YUI Datatable arbeiten:Eigene Callback-Methoden für die AJAX-Anforderung in Prototyp

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() { 
     .... 
} 

Mein Problem ist, dass dataTableCallback nie aufgerufen. Scheinbar wirft es eine Ausnahme auf, dass this undefiniert ist, was ich verstehen kann: Callbacks werden im Objektkontext nicht aufgerufen und somit wird this niemals zugewiesen. Ich habe versucht, callryfying Callbacks, aber gescheitert.

Die Frage ist: Wie kann ich das schaffen?

Antwort

2

erstellen Verschluss für "dieses":

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

Danke, dass wir 'this' etwas anderem zugewiesen haben, war der Schlüssel. –

+0

Dennoch ist eine Kombination aus Ihrer und Cédrics Lösung die beste. –

+0

Trotzdem denke ich, dass Sie dies in diesem Beispiel nicht etwas anderem zuweisen müssen. Da setTableColumn als eine Methode von * this * aufgerufen wird, wird * this * in seinem body gesetzt. Das ist das gleiche wie mit Bind(), aber ein bisschen weniger Prototyp-ish :) – Alsciende

4

Versuchen Sie folgendes:

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

ist die 'Variable enden Beförderungen noch zur Verfügung? – pstanton

+0

Ja, das ist das erste Argument von setTableColums. – Sander

Verwandte Themen