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

为什么 Backbone 会改变你的对象

如果您查看带注释的源代码,您会注意到在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 回答