Meine Modelle haben bereits einen defaults
-Hash. Wenn Teile der Ansicht/Seite zurückgesetzt werden, möchte ich die Modelle auf ihre ursprünglichen Standardeinstellungen zurücksetzen.
Derzeit setze ich jedes Attribut explizit auf seinen Standardwert. Gibt es etwas eingebautes oder eine JavaScript/Underscore.js/Backbone.js/jQuery-Funktion, mit der ich dies in einer einzigen Anweisung tun könnte?
myModel.clear().set(myModel.defaults);
Ich habe folgenden Ansatz gefunden:
reset: function () {
this.clear({silent: true});
this.set(this.defaults);
}
Durch den Aufruf von {silent: true}
im Aufruf clear()
wird sichergestellt, dass das Ereignis change
nicht ausgelöst wird. Es wird nur bei Aufruf von set()
ausgelöst.
Ich mache das, wenn das Modell anfängliche Objekteigenschaften hat.
definieren Sie zunächst defaults als Funktion
var MyModel = Backbone.Model.extends({
defaults:function(){
return {
AnArrayTypeProp:[]
};
}
});
zweitens, wenn das Modell auf den Standard zurückgesetzt werden muss
model.clear().set(model.defaults());
Ich habe auch darüber nachgedacht, model.clear()
und model.set()
in Verbindung zu verwenden. Dann bin ich auf das Problem gestoßen, dass ich das change
-Ereignis jetzt zweimal auslöst. __ Die Verwendung der silent
-Option beim Aufruf von model.clear()
ist keine Option, da ich auch ein change
-Ereignis auslösen möchte, wenn eine Eigenschaft nicht gesetzt wird.
Am Ende habe ich eine model.reset()
-Methode hinzugefügt. Es nimmt einen neuen Attribut-Hash und füllt diesen Hash mit undefined
-Werten für alte Attributschlüssel, die nicht im neuen Attribut-Hash vorhanden sind.
Model.prototype.reset = function(attrs, options) {
for (var key in this.attributes) {
if (key in attrs) continue;
attrs[key] = void 0;
}
return this.set(attrs, options);
};
Auf diese Weise setzen Sie die alten Attribute der Modelle zurück und erhalten für jedes alte und neue Attribut ein gültiges change
-Ereignis.
Basierend auf der Antwort von saabeilin und kommentierter Quelle von Backbone hatte ich eine optimale Funktion, um die Notwendigkeit eines Zurücksetzens eines Modells zu erfüllen.
/**
* Clears the model's attributes and sets the default attributes.
* @param {Object} attrs to overwrite defaults
* @param {Object} options to pass with the "set" call.
* @return {Backbone.Model} this object, to chain function calls.
*/
reset: function(attrs, options) {
// adds default option reset to true
options = _.extend({ reset: true }, options);
// ensure default params
var defaults = _.result(this, 'defaults');
attrs = _.defaults(_.extend({}, defaults, attrs), defaults);
// apply
this.clear({ silent: true }).set(attrs, options);
// triggers a custom event, namespaced to model in order
// to avoid collision with collection's native reset event
// when listening to a collection.
if (!options.silent) this.trigger('model:reset', this, options);
return this;
},
Die folgende Zeile stellt sicher, dass selbst wenn ein Attribut als undefined { test: undefined }
übergeben wird, es immer noch seinen Standardwert hat.
attrs = _.defaults(_.extend({}, defaults, attrs), defaults);
Hier ist ein Beispiel:
var defaults = { test: 1 },
attrs = { test: undefined };
_.extend({}, defaults, attrs); // {test: undefined}
_.defaults(_.extend({}, defaults, attrs), defaults); // {test: 1}
Und wenn Sie es mit allen Backbone-Modellen möchten, können Sie Backbone selbst erweitern:
_.extend(Backbone.Model.prototype, {
reset: function(attributes, options){
/* ... */
}
});
Disclaimer: Tun Sie dies nicht, wenn Sie eine JavaScript-Bibliothek oder ein Backbone-Plugin schreiben, da dies mit einer anderen Bibliothek kollidieren könnte oder ein anderes Verhalten verursachen könnte, als das, was die Person erwartet, die Ihren Code verwendet.
Wie wäre es, den Wert des aktuellen Modells durch ein neues leeres Modell zu überschreiben:
myModel = new model(); // default values will be considered
Meine Lösungen sind:
model.clear({silent: true}).set(model.defaults);