【问题标题】:Sequential Backbone model.set overwrites model.changed attribute顺序主干 model.set 覆盖 model.changed 属性
【发布时间】:2014-05-18 16:02:27
【问题描述】:

我确定我误解了主干模型的changedchangedAttributesset 属性/方法的用途。当我在一个模型上调用set 两次时,changed 属性中只包含第二个属性。例如:

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'}

我对@9​​87654327@ 的第二次访问的期望是{'field1': 'some diff value', 'field2': 'some other value'}

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

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

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

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

    假设您使用的是 0.9.9+ 版本,您可以将 patch 选项传递给您的保存调用,这只会将 changed 属性发送到服务器。 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
    

    【讨论】:

      【解决方案2】:

      来自文档:

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

      查看带注释的源代码,看起来唯一的方法是在模型上调用 save 并传入所有更改的字段和选项补丁:true

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

      另一种选择是监听模型上的所有change 事件并管理内部变化图;请务必在更新服务器端时刷新此地图。

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多