4

私は自分のコードで次のようなことをしています:

data_hash = {};
data_hash['some_model_key'] = 'A';
console.log(data_hash['some_model_key']); /* prints A */
model.save(data_hash,{
    wait:true,
    success:function(){
        console.log(data_hash['some_model_key']); /* prints B */
    }
});                  

サーバーがモデルの状態を変更し、設定しているwait:true場合、バックボーンモデルが新しい値を受け取る必要があることを理解しています。しかし、なぜ私の属性ハッシュが変更されるのですか?

4

1 に答える 1

3

バックボーンがオブジェクトを変更する理由

注釈付きのソースコードを見ると、wait:trueオプションの場合、成功コールバックがattrオブジェクトをサーバー属性で拡張していることがわかります。

    if (options.wait) {
      delete options.wait;
      serverAttrs = _.extend(attrs || {}, serverAttrs);
    }

また、Underscore docによると、_。extendは、ソースオブジェクトのすべてのプロパティを宛先オブジェクトにコピーし、以前に定義されたプロパティをオーバーライドします。選択された動作である理由は推測ですが、すべての参照をモデルの「実際の」状態と同期させるためだと思います。または、予期しない副作用です。

最初に渡すオブジェクトmodel.saveは、保存プロセスの一部としてモデルに設定する属性であることが期待されていることに注意してください。バックボーンドキュメントから

save model.save([attributes]、[options])
属性ハッシュ(セット内)には、変更する属性が含まれている必要があります。言及されていないキーは変更されませんが、リソースがサーバーに送信されます。

オブジェクトに手を触れないようにするためにできること

オブジェクトのクローンを次の宛先に渡しますmodel.save

model.save(_.clone(data_hash), ...)

wait:true注:モデルがサーバーから値を受け取るためのオプションは必要ありませんmodel.set。常に新しい値で呼び出されます。

于 2012-07-20T17:07:09.737 に答える