在Backbone.js的,为什么沉默改变触发更改事件最终?(In Backbone.js, why

2019-07-28 20:02发布

当我通过{"silent":true}而在骨干模型设置一个属性,为什么不只是抑制了change:attribute的事件吗? 什么是下一次的属性被改变发射该事件的优势在哪里?

更新

骨干0.9.10改变传递的行为{ "silent": true } 。 从更新日志:

传递{silent:true}上的变化将不再拖延个人“变化:ATTR”事件,相反,他们是完全沉默。

浏览更改日志这里

Answer 1:

这混淆了我一段时间为好。

其原因是{沉默:真正} 并不意味着“一切正常,但就是不触发事件”。

从@jashkenas,它似乎意味着是“简单地更改属性值(并把它添加到‘changedAttributes’散列),但延迟所有其他的‘更改相关’的活动,直到后来的”各种意见和答案。

“沉默”并不妨碍 change该事件/这些属性,它只是排队的“公告”,直到下一个change事件被触发。

因此,它可能是更好的名字类似defer

相关信息:

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

“沉默”变化的一点是,它不被视为从型号上来看的变化。 后来,当变化实际发生,你得到充分的差异的一次。

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

因为沉默改变的一点是,你允许你的模型,暂时的内部状态来摆弄,实际上并没有做任何更改。 后来,当属性实际上改变,验证运行和事件发出。 这是没有意义做沉默变化时发出一个错误事件。

更新2013年4月7日

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

作为骨干0.9.10的,上面描述的行为已经改变。 在该版本(和更新版本), silent:true抑制change:attr事件完全是-不只是延迟它们。

http://backbonejs.org/#changelog



Answer 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)



文章来源: In Backbone.js, why do silent changes trigger change events eventually?