2

我有一个使用下划线 isEqual 比较两个 JSON 字符串的问题。目前我已经在主干中完成了一个应用程序,并且我正在使用 _.isEqual(savedModel.toJSON(),changedModel.toJSON() ) 来检测页面中的模型是否已更改并提示“您有未保存的更改,请执行你要救吗?” 如果用户厌倦了导航离开,则对话框。

出于某种原因,即使我什么也没做或保存了更改,我也会在随机的地方得到对话框。调试让我发疯。

这可能是因为 JSON 不保证 JSON 中对象的顺序并且下划线 isEqual 不能正确处理这种情况吗?因此,即使模型相同,JSON 中的某些属性也可能不同并返回 false?

伪代码:

//when entering the page the original model is cloned, when user does changes to the   
//page, the model is cloned again
var savedModel = currentModel.clone().toJSON();

//when the user tries to navigate away from the page
if( _.isEqual(savedModel, model.toJSON() ){
    showSavePromptDialog();
}
4

2 回答 2

1

嗨,这个 deep equals 实现是为了解决类似的问题,但我可能错过了一些更精细的细节,它对我的​​目的很有效。

http://yui3.wordpress.com/2013/04/22/deep-compare-in-javascript/

于 2013-10-11T11:59:58.053 回答
1

在backbone.toJSON() 使用的函数链之后,似乎_.extend 用于复制对象,_.extend 使用for..in 循环来迭代对象。for..in 以任意顺序迭代对象,这可能是您的问题的根源。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

于 2013-10-11T10:44:50.600 回答