如何从ember-data存储中提取标准化数据?

时间:2015-01-12 21:51:16

标签: ember.js ember-data

我正在努力将我的ember-data存储缓存到本地存储。在第一次加载时,我查询服务器将数据加载到存储中,然后将其加载到本地存储中。在后续页面加载中,我从localstorage中提取数据并将其加载到商店中。我可以使用pushMany方法执行此操作。

商店的pushMany方法需要规范化数据。来自服务器的有效负载通过将其传递给模型序列化器来规范化。一旦归一化数据存储在商店中,似乎有理由相信应该可以将标准化数据拉出来。

那么如何将标准化数据从商店中拉出来?

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

我想避免不止一次序列化/反序列化。

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

1 个答案:

答案 0 :(得分:2)

问题的一个很好的起点可能是从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;
}