【问题标题】:Make backbone model fetch discard missing fields使主干模型获取丢弃丢失的字段
【发布时间】:2013-09-18 00:41:17
【问题描述】:

假设我有一个 Backbone 模型,当调用 fetch() 时(针对该特定模型,而不是整个集合),它会从服务器获取:

{ a: "val-1", b: "val-2" }

稍后,我再次在模型上调用 fetch(),这次服务器返回:

{ b: "val-x", c: "val-y" }

此时,我希望我的模型具有这种状态,因为这是服务器提供的最新状态:

{ b: "val-x", c: "val-y" }

但是,我的 Backbone 模型具有这种状态:

{ a: "val-1", b: "val-x", c: "val-y" }

如何在 Backbone 中 fetch() 模型,以便结果状态与服务器返回的完全一致,并且不包含旧的过时字段?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    我发现获得所需行为的一种方法是将此解析函数添加到相关模型中:

    parse: function(resp) {
      for (var key in this.attributes) {
        if (resp[key] === undefined) {
          resp[key] = undefined;
        }
      }
    
      return resp;
    }
    

    如果来自服务器的响应缺少本地模型中的属性,它会将该键显式添加到具有未定义值的响应中。这会导致 fetch() 行为正确并将其从模型中删除。

    【讨论】:

    • 确实如此。我认为没有在 Model fetch 上提供重置选项是主干的缺陷。
    【解决方案2】:

    如果您希望 fetch 丢弃本地状态并获取服务器数据而不合并,请使用 {reset: true} 选项。

    来自文档:http://backbonejs.org/#Collection-fetch

    当模型数据从服务器返回时,它使用设置为 (智能)合并获取的模型,除非您通过 {reset: true},在这种情况下,集合将(有效地)重置。

    【讨论】:

    • 该选项用于重新获取整个集合。我正在获取集合中的单个模型。
    • 可以调用model.clear();如果您不关心您拥有的状态,请在获取之前。
    • 不幸的是 clear 不会削减它,因为 fetch() 是异步的,理论上可能需要一段时间才能返回。在此期间,我不能让模型处于不良状态。
    • 不回答问题。问题是关于模型,而不是集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多