2013-10-11 4 views
2

У меня есть вопрос, используя знак подчеркивания isEqual для сравнения двух строк JSON. В настоящее время я сделал приложение в магистрали, и я использую _.isEqual (savedModel.toJSON(), changedModel.toJSON()), чтобы определить, изменилась ли модель на странице и прозвали «У вас есть несохраненные изменения, do вы хотите сохранить? " если пользователь устает уходить.underscore 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

1

Привет это глубоко равно осуществление сделать, чтобы решить подобную проблему, но я, возможно, пропустил некоторые мелкие детали, он хорошо служит для моей цели.

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

Смежные вопросы