私のモデルにはすでにdefaults
ハッシュがあります。ビュー/ページの一部がリセットされたら、モデルを元のデフォルトにリセットしたいと思います。
現在、各属性を明示的にデフォルト値に設定しています。単一のステートメントでこれを行うために使用できる組み込みまたはJavaScript/Underscore.js / Backbone.js / jQuery関数はありますか?
私のモデルにはすでにdefaults
ハッシュがあります。ビュー/ページの一部がリセットされたら、モデルを元のデフォルトにリセットしたいと思います。
現在、各属性を明示的にデフォルト値に設定しています。単一のステートメントでこれを行うために使用できる組み込みまたはJavaScript/Underscore.js / Backbone.js / jQuery関数はありますか?
myModel.clear().set(myModel.defaults);
私は次のアプローチを思いついた:
reset: function () {
this.clear({silent: true});
this.set(this.defaults);
}
通話{silent: true}
に参加clear()
することで、change
イベントが発生しないようにします。呼び出し時にのみ発砲しset()
ます。
これは、モデルにnull以外の初期オブジェクトプロパティがある場合に行います。
まず、デフォルトを関数として定義します
var MyModel = Backbone.Model.extends({
defaults:function(){
return {
AnArrayTypeProp:[]
};
}
});
次に、モデルをデフォルトにリセットする必要がある場合
model.clear().set(model.defaults());
saabeilinの回答とBackboneの注釈付きソースに基づいて、モデルをリセットする必要性を満たすための最適な関数を用意しました。
/**
* 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;
},
{ test: undefined }
次の行は、属性が未定義として渡された場合でも、デフォルト値のままであることを保証します。
attrs = _.defaults(_.extend({}, defaults, attrs), defaults);
次に例を示します。
var defaults = { test: 1 },
attrs = { test: undefined };
_.extend({}, defaults, attrs); // {test: undefined}
_.defaults(_.extend({}, defaults, attrs), defaults); // {test: 1}
また、すべてのバックボーンモデルで必要な場合は、バックボーン自体を拡張できます。
_.extend(Backbone.Model.prototype, {
reset: function(attributes, options){
/* ... */
}
});
免責事項:JavaScript libまたはBackboneプラグインを作成している場合は、これを行わないでください。別のlibと衝突したり、コードを使用している人が期待する動作とは異なる動作を引き起こす可能性があります。
model.clear()
また、一緒に使うことも考えmodel.set()
ました。それから私は問題に遭遇しました、それは私がchange
今イベントを2回トリガーするということです。プロパティが設定解除されたときにイベントを発生させたいので、silent
呼び出すときにオプションを使用することはオプションではありません。model.clear()
change
メソッドを追加することになりましたmodel.reset()
。新しい属性ハッシュを取得し、このハッシュundefined
に、新しい属性ハッシュに存在しない古い属性キーの値を入力します。
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);
};
このようにして、モデルの古い属性をリセットし、change
すべての古い属性と新しい属性に対して有効なイベントを取得します。
現在のモデルの値を新しい空のモデルでオーバーライドするのはどうですか?
myModel = new model(); // default values will be considered
私の解決策は次のとおりです。
model.clear({silent: true}).set(model.defaults);