60

私のモデルにはすでにdefaultsハッシュがあります。ビュー/ページの一部がリセットされたら、モデルを元のデフォルトにリセットしたいと思います。

現在、各属性を明示的にデフォルト値に設定しています。単一のステートメントでこれを行うために使用できる組み込みまたはJavaScript/Underscore.js / Backbone.js / jQuery関数はありますか?

4

7 に答える 7

122
myModel.clear().set(myModel.defaults);
于 2011-07-31T13:54:01.550 に答える
6

私は次のアプローチを思いついた:

reset: function () {
    this.clear({silent: true});
    this.set(this.defaults);
}

通話{silent: true}に参加clear()することで、changeイベントが発生しないようにします。呼び出し時にのみ発砲しset()ます。

于 2016-04-13T22:10:45.823 に答える
5

これは、モデルにnull以外の初期オブジェクトプロパティがある場合に行います。

まず、デフォルトを関数として定義します

var MyModel = Backbone.Model.extends({

    defaults:function(){

        return {
            AnArrayTypeProp:[]
        };
    }

});

次に、モデルをデフォルトにリセットする必要がある場合

model.clear().set(model.defaults());
于 2014-07-20T07:30:11.503 に答える
4

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と衝突したり、コードを使用している人が期待する動作とは異なる動作を引き起こす可能性があります。

于 2016-04-18T04:03:23.757 に答える
3

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すべての古い属性と新しい属性に対して有効なイベントを取得します。

于 2014-10-12T11:00:50.410 に答える
1

現在のモデルの値を新しい空のモデルでオーバーライドするのはどうですか?

myModel = new model(); // default values will be considered
于 2015-05-11T14:21:03.330 に答える
1

私の解決策は次のとおりです。

model.clear({silent: true}).set(model.defaults);
于 2018-08-24T19:44:46.593 に答える