【问题标题】:Ember - Sideloading data within RESTAPISerializerEmber - 在 RESTAPISerializer 中旁加载数据
【发布时间】:2016-06-08 23:12:46
【问题描述】:

我正在尝试使用 RESTAPISerializer 侧载数据,但似乎存在一些问题。

目标是存储带有标签的文章。文章在商店里出现得很好,我可以用 Ember 检查器查看它们。但我似乎无法弄清楚如何存储标签,它们从未出现在检查器中。

我创建了一个名为 blog-tag 的模型来存储标签。它们采用特定格式,我无法更改,它看起来像这样:

tid:term

...我在每篇文章中都得到了它们的数组。

文章模型包含与博客标签的 hasMany 关系。我正在尝试通过序列化程序将它们传递进来,并且一直在使用各种格式(JSON、javascript 数组等)。我也为博客标签编写了一个自定义序列化程序,但它似乎没有多大作用。

有人可以解释我缺少什么吗?

文章模型:

import DS from 'ember-data';
import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({
  title: attr(),
  blogTags: hasMany('blog-tag', { async: true })
});

博客标签模型:

import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({
  tid: attr('number'),
  term: attr('string'),
});

文章序列化器:

import RESTAPISerializer from 'ember-data/serializers/rest';

export default RESTAPISerializer.extend({
  normalizeResponse: function(store, primaryModelClass, payload, id, requestType) {

    var normalizedPayload = {articles: []};

    payload.forEach(function(item) {

      var tags = item.tags.split("|"), blogTags = [];

      // storing blog tags in an array, have also done it as a
      // JSON structure
      var blogTags = tags.map((tag) => {
        var item = tag.split(":"),
        vals = {};
        vals.tid = item[0];
        vals.term = item[1];
        return vals;
      });

      var article = {
        id: item.nid,
        title: item.title,
        blogTags: blogTags,
      };

      normalizedPayload.articles.push(article);

    });
    return this._super(store, primaryModelClass, normalizedPayload, id, requestType);
  },
});

【问题讨论】:

    标签: rest ember.js serialization


    【解决方案1】:

    解决了我自己的问题。为了其他遇到相同问题的人的利益而回答问题。

    我试图做的是嵌入文章序列化程序中的标签。这意味着我需要使用 EmbeddedRecordsMixin。

    http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html

    这实际上非常简单。对上述序列化程序进行了以下更改,添加这些代码后代码按原样工作。

    // app/serializers/articles.js
    import RESTSerializer from 'ember-data/serializers/rest';
    import EmbeddedRecordsMixin from 'ember-data/serializers/embedded-records-mixin';
    export default RESTSerializer.extend(EmbeddedRecordsMixin, {
    
      attrs: {
        blogTags: { embedded: 'always' }
      }
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多