1

人们想知道以下情况的最佳实践和 API 详细信息。

假设我们有一个模型选择:

Selection = Backbone.Model.extend({
  defaults: {
    value : null,
    related: null,
    other: null,
    stuff: null
  }
}

如果我们只更改“值”而不设置“相关”,那么我们希望将“相关”设置为空——一种级联更新。

当 'value' 改变时,还有其他侦听器需要查看 'related' 的更新值。因此,我们希望保证当调用任何这些侦听器时,“相关”会相应更新。

因此,也许我们可以让 Selection 模型本身监听“change:value”,并在必要时设置“related”。但是 Backbone 是否保证该侦听器会在任何其他“change:value”侦听器之前被调用?同样,是否保证合格事件将在通用事件之前触发,所以在“更改”之前“更改:值”?

依靠事件系统来做这件事似乎很脆弱,所以我们寻找了一些钩子。我们能找到的最接近的东西是 _validate/validate 方法,我们可以在其中添加到我们的选择模型中,例如:

// Use _validate as a "before-set call" to set 'related' if necessary
_validate: function(attrs, options) {
  if (!_.has(attrs, 'related') && _.has(attrs, 'value') && 
      !_.isEqual(attrs.value, this.attributes.value)) {
    attrs.related = null;
  }
  return true;
}

当然,这违背了“验证”所隐含的语义。

非常感谢任何指导。

4

2 回答 2

0

由于 Backbone.Model 设置方法支持传递多个属性,我建议重写它。

类似的东西(抱歉使用 CoffeeScript -super这里有点简单):

class myView extends Backbone.View
   set: (attributes, options) ->
       if attributes.value == "something"
             attributes.related = null
             #set all the cascade updates in the attributes object
       super(attributes,options)
于 2013-03-20T17:54:26.820 回答
0

您可以覆盖Model.set并包含您的测试。

沿着这些思路:

var Selection = Backbone.Model.extend({
    defaults: {
        value : null,
        related: null,
        other: null,
        stuff: null
    },

    set: function(key, val, options) {
        var attrs;

        //nothing to set
        if (key == null) return this;

        if (typeof key === 'object') {
           // setting a hash
            attrs = key;
            options = val;
        } else {
           // setting a key-value pair
            (attrs = {})[key] = val;
        }

        // set related values
        if (!_.has(attrs, 'related') && _.has(attrs, 'value') &&  
                  !_.isEqual(attrs.value, this.attributes.value)) {
            attrs.related = null;
        }

        // call the parent
        Backbone.Model.prototype.set.call(this, attrs, options);
    }
});

还有一个小提琴http://jsfiddle.net/nikoshr/KSHwc/

于 2013-03-20T17:59:01.610 回答