wake-up-neo.com

Die einfachste Möglichkeit, das Backbone-Modell auf die ursprünglichen Standardeinstellungen zurückzusetzen?

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?

59
PhD
myModel.clear().set(myModel.defaults);
120
Peter Lyons

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.

5
saabeilin

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());
5
codeboy

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.

3
Johnny

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.

Wiederverwendbarer Reset

/**
 * 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}

Backbone erweitern

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.

3
Emile Bergeron

Wie wäre es, den Wert des aktuellen Modells durch ein neues leeres Modell zu überschreiben:

myModel = new model(); // default values will be considered
1
ismnoiet

Meine Lösungen sind:

model.clear({silent: true}).set(model.defaults);
0
Daniel Ortegón