我正在尝试使用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);
},
});
答案 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' }
}
});