Sequential Backbone model.set覆盖了model.changed属性

时间:2014-05-18 16:02:27

标签: javascript backbone.js

我确定我对骨干模型的目的有些误解。 changedchangedAttributesset属性/方法。当我在模型上调用set两次时,changed属性中只包含第二个属性。 e.g:

model.set('field1', 'some diff value', {silent: true});
model.changed;   // => {'field1': 'some diff value'}

model.set('field2', 'some other value', {silent: true});
model.changed;   // => {'field2': 'some other value'}

changed第二次访问时我期待的是{'field1': 'some diff value', 'field2': 'some other value'}

我想要更改值的完整列表,以便我可以优化服务器的同步,否则可能会拖动许多其他大的未修改字段。我目前使用我自己的changed版本进行此操作,一旦将模型保存到服务器,该版本仅等于{}

我对Backbone有什么遗漏/误解?

2 个答案:

答案 0 :(得分:1)

  

我想要更改值的完整列表,以便我可以优化同步到服务器,否则可能会拖动许多其他大的未修改字段

假设您使用的是0.9.9+版本,则可以将patch选项传递给您的保存调用,该保存调用只会将已更改的属性发送到服务器。 See Model save docs

model.set('field1', 'some diff value', {silent: true});
model.set('field2', 'some other value', {silent: true});
model.save({patch: true}); // field1 and field2 are only attributes saved to server

答案 1 :(得分:1)

来自文档:

  

更改的属性是内部哈希,其中包含自上次设置以来已更改的所有属性。请不要直接更新已更改,因为其状态由set在内部维护。可以从changedAttributes获取更改的副本。

查看带注释的源代码,它看起来是执行后续操作的唯一方法,在传递所有已更改字段和选项补丁的模型上调用save:true

model.save({'field1': 'some diff value', 'field2': 'some other value'}, {patch: true})

另一种选择可能是收听模型上的所有change事件并管理内部更改地图;确保在更新服务器端时刷新此映射。