我有一个主干模型,其中包含在模型的“解析”方法中初始化的子模型,例如:
parse: (response,options) ->
attrs = super
if attrs.child
attrs.child = new Child( attrs.child )
每当我在具有相同类型模型的不同实例的父模型上调用“set”时,即使父模型或子模型中的任何内容都没有更改,也会始终触发“更改”事件。请参阅此处演示的小提琴:http: //jsfiddle.net/inpursuit/ZP7k9/20/
看起来主干中 set() 方法的代码正在使用下划线 isEqual 方法来检测属性是否已更改:
if (!_.isEqual(current[attr], val)) changes.push(attr);
在属性是 Backbone.Model 的情况下,即使子模型的属性相同,isEqual 方法也将始终返回false 。如果项目是模型,这个对 isEqual 的调用不应该传递模型的属性吗?即是这样的:
currrentAttr = if( current[attr] is Backbone.Model ) then current[attr].attributes else current[attr]
newAttr = if( val is Backbone.Model ) then val.attributes else val
if (!_.isEqual(current[attr], val)) changes.push(attr);
底线,我试图防止在另一个模型上设置模型并且两个模型的所有属性都相等时触发更改事件。
谢谢您的帮助!