我有一个问题,使用下划线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();
}
答案 0 :(得分:1)
在backbone.toJSON()使用的函数链之后,看起来_.extend用于复制对象,而_.extend使用for..in循环来迭代对象。 for..in以任意顺序迭代一个对象,这可能是你问题的根源。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
答案 1 :(得分:1)
嗨,这深刻等于实现解决类似问题的实现,但我可能错过了一些更精细的细节,它很适合我的目的。
http://yui3.wordpress.com/2013/04/22/deep-compare-in-javascript/