2

アンダースコア isEqual を使用して 2 つの 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

こんにちは、同様の問題を解決するために行われたこの深い等号の実装ですが、細かい詳細を見逃している可能性があります。それは私の目的にはうまく機能していました。

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 に答える