【问题标题】:How to extract normalized data from the ember-data store?如何从 ember-data 存储中提取规范化数据?
【发布时间】:2015-01-12 21:51:15
【问题描述】:

我正在将我的 ember 数据存储缓存到本地存储。在第一次加载时,我查询服务器将数据加载到存储中,然后将其加载到本地存储中。在随后的页面加载中,我从本地存储中提取数据并将其加载到存储中。我可以使用pushMany 方法来做到这一点。

商店的pushMany 方法需要标准化数据。来自服务器的有效负载通过模型序列化程序进行规范化。一旦规范化数据在存储中,相信应该可以将规范化数据提取出来似乎是合理的。

那么如何从存储中提取标准化数据?

每个模型都有一个_data 属性。 '_data' 属性仅适用于平面模型。更复杂的模型_data 属性包含实例化的关系。

我希望避免多次序列化/反序列化。

This 是我目前的实现。 toJson 方法的问题是它必须加载所有关联,包括尚未解决的异步关系。我认为关于 ember 数据如何解析关系主键/外键存在一个基本问题。

【问题讨论】:

  • 我不知道这是否是您的意思,但您可以通过使用 all - via emberjs.com/guides/models/finding-records/… 从商店获取记录而无需请求服务器,而不发出另一个网络请求,而是使用 all 。” var posts = this.store.all('post'); // => 没有网络请求
  • 这里有一个要点gist.github.com/arenoir/…
  • 这适用于没有关系的模型。 IMO 模型上应该有一种提取原始标准化数据的方法。
  • 是的,我认为解决方案不可能那么简单......

标签: ember.js ember-data


【解决方案1】:

从 ember-data 实现 toJSON 可能是解决问题的一个很好的起点。

正如您所提到的,toJSON 的问题在于它正在解析所有关联。对于 belongsTo 关系,使用 _data 获取相关对象的 id 很容易避免这个问题。

customToJSON: function(record) {
  var json = {};
  json.id = record.get('id');

  var serializer = DS.JSONSerializer.create({ container: record.container });

  record.eachAttribute(function(key, attribute) {
    serializer.serializeAttribute(record, json, key, attribute);
  }, this);

  record.eachRelationship(function(key, relationship) {
    if (relationship.kind === 'belongsTo') {
        json[relationship.key] = record._data[relationship.key].id;
    }
  });

  return json;
}

【讨论】:

  • 到目前为止,我认为这个问题还没有很好的答案。 ember 数据团队正在研究它。这个快照 api 看起来很有希望。 github.com/emberjs/data/pull/2623。感谢您的回答,我会将赏金奖励给您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多