Ember.js - 不确定如何建模数据

Ember.js - Not sure how to model data

我正在使用来自 Ember 数据的 RESTAdapter 来处理 JSON 负载。部分有效载荷包含

等数据
"links": {
    "facebook": "http://www.facebook.com/dailypuppy",
    "twitter": "http://twitter.com/dailypuppy",
    "officialWebsite": "http://www.dailypuppy.com/"
},

我不太确定如何对数据建模。我注意到 RESTSerializer 有一个 normalizePayload 函数,所以我想我应该尝试一下而不是 RESTAdapter。我是这样用的

normalizePayload: function(payload) {
    payload.facebookUrl = payload.links.facebook;
    payload.twitterUrl = payload.links.twitter;
    payload.mySpaceUrl = payload.links.myspace;
    payload.officialWebsiteUrl = payload.links.officialWebsite;
    delete payload.links;
    return payload;
}

这种方法的问题是 RESTSerializer 不支持我所依赖的 findQuery 方法。我收到一条错误消息 tried to load a query but your adapter does not implement findQuery

如有任何帮助,我们将不胜感激。

根据您的描述,我认为您误将序列化程序用作(读取:代替)适配器。这行不通。不要这样做。万恶将降临。

您只描述了部分有效负载,因此我假设这是 json 数据对象的一部分,在其他方面都符合 RESTAdapter and RESTSerializer 的预期。

现在,如图所示覆盖 normalizePayload 应该可行,但是您不使用 RESTSerializer 而不是 RESTAdapter。您将序列化程序 替换为 RESTAdapter 中的内容。如果您(使用 ember-cli)生成一个应用程序适配器 (ember g adapter application),您可以像这样为您的 RESTAdapter 自定义序列化程序 (app/adapters/application.js):

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  serializer: DS.RESTSerializer.create({
    normalizePayload: function(payload) {
      function doNormalize(payload) {
        payload.facebookUrl = payload.links.facebook;
        payload.twitterUrl = payload.links.twitter;
        payload.mySpaceUrl = payload.links.myspace;
        payload.officialWebsiteUrl = payload.links.officialWebsite;
        delete payload.links;
        return payload;
      }

      // Change 'attractions' with other payloads here 
      if(Array.isArray(payload.attractions)) {
        payload.attractions = payload.attractions.map(doNormalize);
        return payload;
      } else {
        return doNormalize(payload);
      }
    }
  })
});

(代码未经测试,但应该能说明思路)

因为可能并非所有有效负载都包含此 links 属性,您可能只想为特殊的 thing 自定义适配器 - 只需替换 applicationthing 在我上面写的所有内容中,你已经有了专门的 thing 适配器。所有不是 thing 的东西都将继续使用默认的应用程序适配器。