当我在Backbone模型中设置属性时传递{"silent":true}
时,为什么不能仅抑制change:attribute
事件?下次更改属性时触发该事件有什么好处?
更新
Backbone 0.9.10改变了传递{ "silent": true }
的行为。来自更改日志:
传递
{silent:true}
更改将不再延迟个人 “改变:attr”事件,而不是完全沉默。
浏览更改日志here
答案 0 :(得分:30)
这也困扰了我一段时间。
原因是{silent:true} 不意味着“一切正常,但不要触发事件”。
来自@jashkenas的各种评论和回答,它似乎意味着“只需更改属性值(并将其添加到'changedAttributes'哈希),但推迟所有其他”与变更相关的“活动,直到以后”。
'silent'不会阻止针对该/属性的change
事件,它只是排队'公告',直到触发下一个change
事件。
所以,它可能更好地命名为defer
。
相关信息:
https://github.com/documentcloud/backbone/pull/850
“无声”变化的一点是,从模型的角度来看,它不被认为是一种变化。之后,当实际发生变化时,您可以立即获得全部差异。
https://github.com/documentcloud/backbone/issues/870
因为无声变化的一点是你可以暂时改变你的模型的内部状态,而不是实际做出改变。稍后,当属性实际更改时,将运行验证并发出事件。在进行静默更改时发出错误事件是没有意义的。
注意:我没有对此进行测试以确认行为,这只是基于我对发行说明的阅读......
从Backbone 0.9.10开始,上述行为发生了变化。在该版本(及更新版本)中,silent:true
完全抑制了change:attr
个事件 - 不仅仅是延迟它们。
答案 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)
。