Backbone.js 具有数组/对象属性的主干模型:无限';改变';同步()后触发的事件?
我的backbone.js模型有一个数组属性。我将Backbone.js 具有数组/对象属性的主干模型:无限';改变';同步()后触发的事件?,backbone.js,Backbone.js,我的backbone.js模型有一个数组属性。我将change事件绑定到save() 在sync()(由save()触发)之后,我的应用程序服务器返回一个相同的JSON,但主干认为数组已更改(我猜是由于对数组的引用不同?),并再次触发更改。然后发生无限循环 save() -> sync() -> triggered `change` -> save()... 我该怎么办 想法:我可以将更改事件绑定到一个函数,该函数检查更改的属性是否为object/array类型,并进行深入比
change
事件绑定到save()
在sync()
(由save()
触发)之后,我的应用程序服务器返回一个相同的JSON,但主干认为数组已更改(我猜是由于对数组的引用不同?),并再次触发更改。然后发生无限循环
save() -> sync() -> triggered `change` -> save()...
我该怎么办
想法:我可以将更改事件绑定到一个函数,该函数检查更改的属性是否为object/array类型,并进行深入比较,只有在数组/对象确实更改时才调用save。如果为true,则save()
谢谢!主干网在许多方法上都有一个特殊的选项来防止这种问题:
静默:true
。如果将该选项传递给保存
方法,则生成的同步
不会触发更改事件
因此,如果要将更改事件处理程序设置为静默保存,请执行以下操作:
changeHandler: function() {
this.save({silent:true});
}
应该可以了。试试边缘版本的主干(主分支)此行为在0.9.9之后发生了更改-请参见我实际上希望触发更改事件,以便在保存时将“id”之类的属性分配回主干模型。因此,如果可能,最好让主干对对象/数组进行深入比较?主干使用内部
更改的
属性跟踪模型是否发生了更改ed或not(具体来说,哪些属性已更改),然后它使用hasChanged
方法检查该属性。您当然可以覆盖hasChanged
,使其按您的意愿工作。我已经跟踪到\u computeChanges()
方法,其中它使用一个简单的!==
而不是下划线的isEqual()
作为数组/对象。我想知道重写\u computeChanges()是否安全
用于我的用例。如果一个方法名称在Javascript中以\uu
开头,这通常意味着它是一个私有方法,因此重写不安全。已更改
不是私有的,因此重写(相对)是安全的。