【问题标题】:How to force ember data to reset all fields of a record on reload?如何强制 ember 数据在重新加载时重置记录的所有字段?
【发布时间】:2015-04-16 05:29:51
【问题描述】:

我正在使用带有 ember 数据的 ember,并且我有一个需要重新加载模型的场景。重新加载时,当获取数据并且该模型的某些字段为空时,旧数据仍然存在。例如,如果我有一个 Post 模型

App.Post = DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string'),
});

现在服务器第一次返回如下数据:

{
  "post" : {
              "id" : "1",
              "name" : "new post",
              "description": "some description"
           }
}

调用reload后,服务器返回如下数据:

{
  "post" : {
              "id" : "1",
              "name" : "new post",
           }
}

因此,在重新加载后,该记录的“描述”字段应设置为空。但是旧数据,即“一些描述”仍然存在于该字段中。

如何强制 ember 数据在重新加载时重置所有字段?

【问题讨论】:

  • 为什么在第二次调用服务器时缺少描述字段? description 不应该是 "description": "" 吗?
  • 服务器仅在字段存在时发送数据。在这种情况下,描述已变为空,因此服务器不会发送它。
  • 如果描述为空,你没有办法强制服务器发送一个空值吗?我很确定它会解决您的问题。
  • 或许能解决问题。但我试图从客户端解决它。如果服务器为每个字段发送值,即使它是空的,这将增加服务器为每个响应发送的数据量。例如,如果模型中有 10 个字段,但只有 5 个字段适用于特定记录,则服务器仍将发送所有 10 个字段。如果我们要获取大量记录,情况会更糟。
  • 确实如此。好吧,我想您唯一的选择是在从服务器重新加载模型之前手动清空模型上的所有字段,因为重新加载只会覆盖服务器明确发送的字段。 rollback() 对您没有帮助,因为您的记录一开始就不是空的。

标签: javascript ember.js ember-data


【解决方案1】:

不幸的是,您想要的确切功能was deprecated a few months ago。在底部,它提到了在序列化程序中用null 替换缺失属性的方法。

// app/serializers/application.js
// or App.ApplicationSerializer
export default DS.RESTSerializer.extend({
  normalize: function(type, hash, prop) {
    hash = this._super(type, hash, prop);

    // Find missing attributes and replace them with `null`
    type.eachAttribute(function(key) {
      if (!hash.hasOwnProperty(key)) {
        hash[key] = null;
      }
    });

    return hash;
  }
});

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多