【问题标题】:Ember.js - Not sure how to model dataEmber.js - 不确定如何建模数据
【发布时间】:2015-04-11 00:30:46
【问题描述】:

我正在使用 Ember 数据中的 RESTAdapter 来处理 JSON 有效负载。部分payload包含诸如

之类的数据
"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

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    根据您的描述,我认为您误将序列化程序用作(阅读:代替)适配器。这行不通。不要这样做。各样的恶都会临到你身上。

    您只描述了负载的一部分,所以我假设这是一个 json 数据对象的一部分,在其他所有方面都符合RESTAdapterRESTSerializer 的期望。

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

    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 自定义适配器 - 只需将 application 替换为 thing 在我上面写的所有内容中,并且您已经有了专门的thing 适配器。不是thing 的所有内容都将继续使用默认应用程序适配器。

    【讨论】:

    • 感谢您的反馈。我尝试将序列化程序放在 RESTAdapter 中,但现在我收到一条错误消息,上面写着 Cannot read property 'facebook' of undefined
    • 这意味着,您有一些没有links 数组的数据。也许您有除things 以​​外的其他东西要加载和更改应用程序适配器,而不是thing 适配器。或者只有一些things 包含links 数组。根据此情况,使用thing 适配器或检查normalizePayload(如果存在links 数组)。
    • 我正在使用 mirage 模拟数据并验证所有数据都包含一个 links 数组。我认为问题可能会浮出水面,因为当适配器被调用时(在这个特定的用例中),多行被返回(它是从用户搜索表单中调用的)。由于返回了多行,payload.links 未定义,而payload.attractions[row_n].links 包含数据。这有意义吗?
    • 是的,确实如此。一般来说,normalizePayload 应该同时提供单个记录和记录数组。从您提供的示例中,我错误地假设您 - 在您的应用程序中 - 可以排除记录数组。为了我的辩护,那是在德国的夜晚。 ;)
    • 感谢您的帮助。仍在努力让它与记录数组一起工作,但我会坚持下去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多