Ich würde gerne in der Lage sein, jQuery's Deferred-Objekt zu verwenden, um das Laden von Daten über Backbone Collections und Models zu betreiben. Gibt es eine Möglichkeit, die Argumente zu ändern, die für die Rückrufaktionen done und fail bereitgestellt werden, um die Model- oder Collection-Instanz einzuschließen? Ich bin etwas Vorstellungsvermögen wie folgt aus:Kann ich die deferred.pipe-Methode von jQuery verwenden, um die Argumente für aufgelöste/fehlgeschlagene Callbacks zu ändern?
var _sync = Backbone.sync;
Backbone.sync = function() {
var jqXhr = _sync.apply(this, arguments);
var self = this;
return jqXhr.pipe(function() {
var cbArgs = [self];
cbArgs.push.apply(cbArgs, arguments);
return cbArgs;
}
}
...
var c = new Backbone.Collection();
c.url = "/path/to/resources";
c.fetch().then(function(collection, data, textStatus, jqXhr) {
// do stuff with collection
});
Natürlich, da Filter ein Array zurückgibt, die getan Rückruf wird mit einem Array aufgerufen, anstatt die aufgezählten Argumente. Soweit ich sehen kann, kann Pipe nur die angegebenen Argumente modifizieren, nicht hinzufügen. Irgendwelche Vorschläge würden geschätzt werden.
Edit: Dies ist ein sehr vereinfachtes Beispiel; Da eine Schließung über der ursprünglichen Sammlung erstellt wurde, konnte ich einfach daran arbeiten. Der Anwendungsfall ist jedoch, dass sich mehrere Backbone-Ansichten auf die gleichen Daten beziehen, die abgerufen werden. Daher möchte ich das jQuery Deferred-Objekt nur diesen Sichten und nicht nur der verzögerten und der Sammlungsinstanz zur Verfügung stellen.
Andere Edit: Posted eine Lösung unten, aber andere Vorschläge willkommen.
Edite d um das ursprüngliche jqXhr um das neue $ .Deferred zu erweitern, wobei die Unterstützung für alle AJAX-spezifischen Methoden (.success, .abort, etc.) erhalten bleibt. – philm