Lösung Modell in Backbone.js - Anrufen stellen Sie mit {silent:true} und trigger-Attribut-change-events?
Ich habe ein Diagramm, Modell:
//PSEUDO
chartModel = Backbone.Model.extend({
defaults: {
year : 1970,
selected = ["Sweden", "Denmark"]
}
}
Ich würde jetzt gerne beide Jahr & ausgewählt:
chartModel.set({year: 1987, selected : ["Finland"]})
Aber bevor ich trigger das Modell ändern möchte ich "auflösen" die änderungen an diesem instabilen Modell. Also ich pass silent:true und überschreiben Sie die set-Methode:
chartModel.set({year: 1987, selected : ["Finland"]}, {silent:true})
//Pseudo set override
set : function(attrs, options) {
//Extract attributes and options.
options || (options = {});
if (!attrs) return this;
if (attrs.attributes) attrs = attrs.attributes;
var now = this.attributes, escaped = this._escapedAttributes;
[...]
datamanager.loadNewDataIfNeeded(oldModel, newModel, callback)
Ich würde speziell wie ein Daten-manager "diff" die alten Attribute vs die neue, bevor ich auslösen des change-Ereignisses:
callback : function(){
chartModel.change();
}
Nun - wenn ich weiß, dass die richtigen Daten vorhanden sind, möchte ich die Ansichten zu Rendern.
... Aber meiner Sidebar anzeigen, die gebunden ist, zu ändern:ausgewählt nicht machen?
Sidebar = Backbone.View.extend({
initialize: function(){
this.model.bind("change:selected", this.render);
}
render : [...]
});
Meine Fragen:
- Beim auslösen-Modell.change() mit der Hand, warum werden nicht die einzelnen Attribut-change-events ausgelöst?
- Brauche ich wirklich zu überschreiben, das Modell set-Methode zu erreichen, was ich möchte ("Lösung der Modell wenn Sie mehrere Attribute geändert werden, auf einmal") oder gibt es eine bessere Methode?
InformationsquelleAutor dani | 2011-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Meinung, basierend auf meinem Verständnis von dem, was Sie versuchen zu tun, ist dies:
Selten oder nie überschreiben Sie die set-Methode; nicht sicher, warum Sie das Gefühl haben, es zu tun in diesem Fall.
Wenn Sie den Aufruf der set-Methode ohne {silent: true}, sollten Sie die get-Ereignisse für den Wandel:Jahr und verändern:ausgewählt und ändern. Aber Objekte sind an Sie gebunden, um Sie zu bekommen. Finden Sie die bind-Funktion.
Wenn Sie rufen Sie die Funktion ändern, nur das change-Ereignis ausgelöst wird. Das Attribut level-Ereignisse werden nicht ausgelöst.
Es klingt wie Sie sollte nicht überschreiben werden die set-Methode und nur sicherzustellen, dass Sie haben die richtige Bindung in den Objekten, die ein Interesse daran haben, in diesem Modell ändert. Auch beseitigen silent: true passage.
Hier finden Sie den code, basierend auf Ihren Kommentar:
});
wo das Modell selbst ist Bindung an die change-Ereignisse für die a-und b Attribute und Umgang mit diesen, indem Sie überprüfen, um zu sehen, ob es berechnen kann c, dann tut das so ist, dann wird der Wert des c basiert auf der Ajax-Rückgabe. Das Modell wird dann "trigger" ändern:c' für eine Ansicht zu beobachten. Ich entwarf in der Ansicht, Sanitär-ermöglichen würde.
Dieser code ist ungetestet, aber hoffentlich konzeptionell schließen.
Nochmals vielen Dank für den großen input. Das Beispiel wird allerdings ziemlich teuer, wenn ich z.B. 10 Attribute und berechnen wollen viele voneinander abhängige Attribute vor der Aktualisierung von Ansichten und hash. Angenommen, der Benutzer will ein Beispiel wählen, Stand in der "chart-Anwendung". Die set () - Methode erhält 10 verschiedene Parameter und basiert auf den Interdependenzen von diesen Daten, die geladen werden soll, Skalen aktualisiert usw. Wenn all dies wurde auch herausgefunden, es ist Zeit zum auslösen des change-events. Das ist die Art von Logik, die ich möchte zu implementieren ...
Dann wollen Sie wahrscheinlich einfach anmelden für das change-Ereignis und vielleicht die changedAttributes-Funktion, um zu bestimmen, wenn Sie brauchen, um Ihren server nennen. Ich denke Sie können nun alle Konzepte, die Sie benötigen, um dieses Problem zu lösen.
InformationsquelleAutor Bill Eisenhauer