如何判断Backbone.js中的模型是否未更改?

时间:2011-11-20 20:51:06

标签: javascript backbone.js underscore.js

这可能是因为误用组件,但我不这么认为。 我有一个问题,View在Backbone JS中更新模型并调用模型的Set方法,以便它可以验证它的输入。 从理论上讲,这种行为有两个结果:错误和变化。 两项活动均按规定运作。 但实际上还有第三个事件:没有变化。 也就是说,如果输入完全没有改变,我在调用Set之后无法判断,因为不会抛出任何错误,也不会发生更改事件,因为没有实际改变 - 但我仍然想知道这样的情况。 我有办法做到这一点吗?

原因是只有在没有错误发生的情况下才会执行我想要执行的操作,但是我无法知道(没有更改事件)模型已尝试设置新值并且没有结果因为这一切都是异步发生的。

谢谢!

2 个答案:

答案 0 :(得分:8)

每个Backbone模型都有一个hasChanged method

  

hasChanged model.hasChanged([attribute])

     

自上次"change"事件以来模型是否已更改?如果传递属性,则返回true,如果该特定属性已更改。

也许你可以用它来检查你的第三种可能性。

BTW,回调不是异步的。触发错误和更改的回调并在set returns之前返回:

set : function(attrs, options) {
  //...

  // Run validation.
  if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;

  //...

  // Update attributes.
  for (var attr in attrs) {
    var val = attrs[attr];
    if (!_.isEqual(now[attr], val)) {
      now[attr] = val;
      delete escaped[attr];
      this._changed = true;
      if (!options.silent) this.trigger('change:' + attr, this, val, options);
    }
  }

_performValidation调用会触发错误回调,this.trigger调用将调用每个属性的回调。

答案 1 :(得分:0)

在这种情况下,您可能需要在Model.set()附近跳一点才能到达您想要的位置。如果您使用此功能,那么您应该在模型上定义validate()方法。

http://documentcloud.github.com/backbone/#Model-validate

所以你可以直接调用这个方法......

// something happens and we need to update the model to "newvalues"
if (model.validate(newvalues)) {
  model.trigger('error')
} else {
  model.trigger('change')
}
model.set(newvalues)

这样,即使它是相同的,你也总是至少得到'改变'或'错误'。您还将从set中获取现有事件。