javascript - una - La forma más fácil de restablecer el modelo de Backbone a los valores predeterminados iniciales?
pasar valor a una funcion javascript (6)
Mis modelos ya tienen un hash defaults
. Cuando se restablecen partes de la vista / página, deseo restablecer los modelos a sus valores predeterminados originales.
Actualmente, establezco explícitamente cada atributo a su valor predeterminado. ¿Hay algo incorporado o una función JavaScript / Underscore.js / Backbone.js / jQuery que pueda usar para hacer esto en una sola declaración?
¿Qué hay sobre anular el valor del modelo actual con un nuevo modelo vacío?
myModel = new model(); // default values will be considered
En saabeilin de la respuesta de saabeilin y de la fuente anotada de Backbone , obtuve una función óptima para completar la necesidad de restablecer un modelo.
Restablecimiento reutilizable
/**
* 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;
},
La siguiente línea garantiza que incluso si un atributo se pasa como undefined { test: undefined }
, aún tendrá su valor predeterminado.
attrs = _.defaults(_.extend({}, defaults, attrs), defaults);
Aquí hay un ejemplo:
var defaults = { test: 1 },
attrs = { test: undefined };
_.extend({}, defaults, attrs); // {test: undefined}
_.defaults(_.extend({}, defaults, attrs), defaults); // {test: 1}
Ampliando columna vertebral
Y si lo quiere con todos los modelos Backbone, puede ampliar Backbone en sí mismo:
_.extend(Backbone.Model.prototype, {
reset: function(attributes, options){
/* ... */
}
});
Descargo de responsabilidad: No haga esto si está escribiendo un plu de JavaScript o Backbone, ya que podría colisionar con otra lib o podría causar un comportamiento diferente al esperado por la persona que usa su código.
Lo hago cuando el modelo tiene propiedades de objeto iniciales que no son nulas.
primero, defina los valores predeterminados como una función
var MyModel = Backbone.Model.extends({
defaults:function(){
return {
AnArrayTypeProp:[]
};
}
});
segundo, cuando sea necesario para restablecer el modelo al valor predeterminado
model.clear().set(model.defaults());
Se me ocurrió el siguiente enfoque:
reset: function () {
this.clear({silent: true});
this.set(this.defaults);
}
Tener {silent: true}
en la llamada a clear()
asegura que el evento de change
no se active; será fuego solo en la llamada a set()
.
También pensé en usar model.clear()
y model.set()
conjuntamente. Luego me encontré con el problema, que activé el evento de change
dos veces. Usar la opción silent
al llamar a model.clear()
no es una opción, porque también quiero que se model.clear()
un evento de change
cuando una propiedad se desarma.
Terminé agregando un método model.reset()
. Toma un hash de atributos nuevo y rellena este hash con valores undefined
para las claves antiguas de atributos que no están presentes en el nuevo hash de atributo.
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);
};
De esta forma, restablece los atributos antiguos de los modelos y obtiene un evento de change
válido para cada atributo antiguo y nuevo.
myModel.clear().set(myModel.defaults);