2013-10-11 2 views
2

두 개의 JSON 문자열을 비교하려면 밑줄 isEqual을 사용하는 질문이 있습니다. 현재 백본에서 응용 프로그램을 만들었으며 _.isEqual (savedModel.toJSON(), changedModel.toJSON())을 사용하여 페이지에서 모델이 변경되었는지 확인하고 "변경 사항을 저장하지 않았습니다. 너 저장하고 싶어? " 사용자가 멀리 이동할 때 타이어가 있으면 대화 상자가 나타납니다.밑줄 isEqual 및 JSON

아무 것도하지 않았거나 변경 사항을 저장했지만 아무 이유없이 대화 상자가 표시됩니다. 디버깅이 나를 미치게 만듭니다.

JSON이 JSON에서 개체의 순서를 보증하지 않으며 isEqual이이 사례를 제대로 처리하지 못하기 때문에 이것이 가능한가요? 따라서 모델이 동일하더라도 JSON의 일부 속성이 다를 수 있으며 false를 반환합니다.

의사 코드 : backbone.toJSON()에 의해 사용되는 함수의 체인 후

//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

_.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

관련 문제