我有一个包含子模型的Backbone模型,这些子模型在模型的“parse”方法中初始化,如:
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);
最重要的是,我试图阻止在另一个模型上设置模型并且两个模型的所有属性相等时触发更改事件。
感谢您的帮助!