在Backbone.js中,为什么静默更改最终会触发更改事件?

时间:2012-04-05 14:05:10

标签: backbone.js backbone-events backbone-model

当我在Backbone模型中设置属性时传递{"silent":true}时,为什么不能仅抑制change:attribute事件?下次更改属性时触发该事件有什么好处?

更新

Backbone 0.9.10改变了传递{ "silent": true }的行为。来自更改日志:

  

传递{silent:true}更改将不再延迟个人   “改变:attr”事件,而不是完全沉默。

浏览更改日志here

2 个答案:

答案 0 :(得分:30)

这也困扰了我一段时间。

原因是{silent:true} 意味着“一切正常,但不要触发事件”。

来自@jashkenas的各种评论和回答,它似乎意味着“只需更改属性值(并将其添加到'changedAttributes'哈希),但推迟所有其他”与变更相关的“活动,直到以后”。

'silent'不会阻止针对该/属性的change事件,它只是排队'公告',直到触发下一个change事件。

所以,它可能更好地命名为defer

相关信息:

https://github.com/documentcloud/backbone/pull/850

  

“无声”变化的一点是,从模型的角度来看,它不被认为是一种变化。之后,当实际发生变化时,您可以立即获得全部差异。

https://github.com/documentcloud/backbone/issues/870

  

因为无声变化的一点是你可以暂时改变你的模型的内部状态,而不是实际做出改变。稍后,当属性实际更改时,将运行验证并发出事件。在进行静默更改时发出错误事件是没有意义的。

2013年4月7日更新

注意:我没有对此进行测试以确认行为,这只是基于我对发行说明的阅读......

从Backbone 0.9.10开始,上述行为发生了变化。在该版本(及更新版本)中,silent:true完全抑制了change:attr个事件 - 不仅仅是延迟它们。

http://backbonejs.org/#changelog

答案 1 :(得分:2)

在主干0.9.2中,set函数在更新任何更改之前运行验证。

  // Run validation.
  if (!this._validate(attrs, options)) return false;

如果传递{silent: true}选项,则不会执行验证代码。

  if (options.silent || !this.validate) return true;

这意味着,model.set({value: 100}, {silent: true});能够将“无效”值设置为模型,因此属性会更新,但更改事件不会触发。

这很有用,然后您想要更新某些字段并阻止整个模式验证,因此如果模型尚未完成,则更改仍会传播到属性。但您通常也希望视图显示更改,因此您必须手动调用model.change()model.trigger('change:value', model, value)