我确定我对骨干模型的目的有些误解。 changed
,changedAttributes
和set
属性/方法。当我在模型上调用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有什么遗漏/误解?
答案 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
事件并管理内部更改地图;确保在更新服务器端时刷新此映射。