2013-10-11 88 views
2

我有一个问题,使用下划线isEqual来比较两个JSON字符串。目前我已经在骨干网上完成了一个应用程序,并且我正在使用_.isEqual(savedModel.toJSON(),changedModel.toJSON())检测模型是否在页面中发生了变化,并提示“您有未保存的更改,你想保存吗?“对话如果用户轮胎离开。下划线isEqual和JSON

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

难道这是因为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

看看一个这个http://stackoverflow.com/questions/1068834/object-comparison-in-javascript –

+0

根据记录,'Backbone.Model.toJSON()''返回attributes'模型的属性不是'JSON'字符串。你有什么理由不能使用[hasChanged](http://backbonejs.org/#Model-hasChanged)? – j03w

回答

1

继由backbone.toJSON()使用的功能链,它出现_.extend用于复制的对象和_.extend使用for..in循环迭代在物体上。 for..in以任意顺序遍历一个对象,这可能是问题的根源。

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

+1

是不知道的,但_.isEqual应该是一个深层比较,实际上toJSON返回的对象是一个数组,而不是一个字符串,所以如果isEqual没有正确实现,那么顺序应该没有关系。 – TeraTon

+0

我同意,与Underscore.js 1.6.0 isEqual()仍然是破,我浪费了一段时间试图自己弄清楚这一点。 – AsGoodAsItGets