Ember - 在RESTAPISerializer中侧载数据

时间:2016-06-08 23:12:47

标签: rest ember.js serializer

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

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

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

tid:term

...我每篇文章都会得到一些数组。

文章模型包含与blog-tags的hasMany关系。我试图通过序列化器传递它们,并且一直在使用各种格式(JSON,javascript数组等)我也为博客标签编写了一个自定义序列化器,但它似乎没有做太多。 / p>

有人可以解释我缺少的东西吗?

文章模型:

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);
  },
});

1 个答案:

答案 0 :(得分:0)

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

我试图做的是嵌入文章序列化程序中的标签。这意味着我需要使用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' }
  }

});