Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 具有数组/对象属性的主干模型:无限';改变';同步()后触发的事件?_Backbone.js - Fatal编程技术网

Backbone.js 具有数组/对象属性的主干模型:无限';改变';同步()后触发的事件?

Backbone.js 具有数组/对象属性的主干模型:无限';改变';同步()后触发的事件?,backbone.js,Backbone.js,我的backbone.js模型有一个数组属性。我将change事件绑定到save() 在sync()(由save()触发)之后,我的应用程序服务器返回一个相同的JSON,但主干认为数组已更改(我猜是由于对数组的引用不同?),并再次触发更改。然后发生无限循环 save() -> sync() -> triggered `change` -> save()... 我该怎么办 想法:我可以将更改事件绑定到一个函数,该函数检查更改的属性是否为object/array类型,并进行深入比

我的backbone.js模型有一个数组属性。我将
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
开头,这通常意味着它是一个私有方法,因此重写不安全。
已更改
不是私有的,因此重写(相对)是安全的。