清除 Backbone.js 模型上除一个属性之外的所有属性

nvbavucw  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(176)

我有一个模型,它的属性比默认属性多。我需要在guest更改时清除所有属性,并设置回默认值,这样我就不会携带不必要的属性。
由于change:guest事件,清除所有属性并将默认值设回会导致无限循环。
如何删除除一个属性之外的所有属性?
当Model属性被设置回默认值时,有没有办法不触发另一个change事件?
或者删除默认设置中未列出的任何内容?
这是我的模型

defaults: {
  _id: 'id',
  first_name: 'first_name',
  last_name: 'last_name',
  guest: true
}

我监听'guest'更改事件

this.on('change:guest', this.reset);

change事件调用reset来更新Model,显然这会导致无限循环。

reset: function() {
  var new_defaults = _.clone(this.defaults);
  this.clear({silent: true});
  this.set(new_defaults);
}
relj7zay

relj7zay1#

我已经做了一个reset函数,你可以很容易地添加到一个基本的 Backbone 模型。我会在another answer中详细介绍这个解决方案。
它比一个简单的.clear后跟一个.set要好,因为它将defaults合并回模型中,让任何传递的attributes像初始化时一样覆盖它们。

/**
 * Clears the model's attributes and sets the default attributes.
 * @param {Object} attributes to overwrite defaults
 * @param {Object} options to pass with the "set" call.
 * @return {Backbone.Model} this object, to chain function calls.
 */
reset: function(attributes, options) {
    options = _.extend({ reset: true }, options);

    // ensure default params
    var defaults = _.result(this, 'defaults'),
        attrs = _.defaults(_.extend({}, defaults, attributes || {}), defaults);

    // apply
    this._reset(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;
},

/**
 * Private method to help wrap reset with a custom behavior in child
 * classes.
 * @param {Object} attributes to overwrite defaults
 * @param {Object} options to pass with the "set" call.
 */
_reset: function(attrs, options) {
    this.clear({ silent: true }).set(attrs, options);
},

然后您的模型:

var MyModel = BaseModel.extend({
    idAttribute: '_id',
    defaults: {
        first_name: 'first_name',
        last_name: 'last_name',
        guest: true
    },
    initialize: function() {
        this.listenTo(this, 'change:guest', this.onGuestChange);
    },
    onGuestChange: function(model, value, options) {
        this.reset(null, { silent: true });
    }
});

这样,当onGuestChange处理程序改变guest时,您可以更灵活地处理所发生的事情,这使得您可以根据需要调用reset,这里使用了{ silent: true }选项。

概念验证

第一个
你不需要克隆默认值来使用它们,如果它们有一个数组或者嵌套的对象,defaults应该是一个返回对象的函数。

defaults: function() {
    return {
        arr: [],
        nested: { prop: 'test' }
    };
},

然后,使用_.result调用默认值:_.result(this, 'defaults')类似于我的reset函数。defaults的 Backbone.js 文档中有以下注意事项:

  • 请记住,在JavaScript中,对象是通过引用传递的,因此如果您将一个对象作为默认值,它将在所有示例中共享。相反,请将defaults定义为函数。*

相关问题