我有一个为帖子显示和创建评论的组件,这个组件有一个用于创建新评论的表单,并通过帖子将它们发送到后端,正常的有效负载为:
{
data: {
attributes: {
created_at: "foo",
autor: "foo",
text: "foo"
},
relationships: {
post: {
data: { type: "posts", id: 1234 },
id: "1234",
type: "loans"
}
},
type: "comment"
}
}当您需要在另一个视图中使用组件时,问题就来了,更重要的是,当模型的名称不同时,比如说posts_breakdown,在这种情况下,有效负载将是:
{ data: {
attributes: {
created_at: "foo",
autor: "foo",
text: "foo"
},
relationships: {
post: {
data: null
}
},
type: "comment"
}
}显然,在注释中,没有关系posts_breakdown,这是我尝试使用posts_breakdown: belongsTo (posts_breakdown)将此关系添加到模型中的第一件事。
问题是,后台无法识别它,也无法对其进行修改。后端获取关系上的值,将评论与帖子关联起来(评论表中的post_id字段)
My question:有没有办法“欺骗”后端和/或修改负载,所以认为post_breakdown模型已经发布了?
下面是我如何定义模型的表示:
comment.js:
export default DS.Model.extend ({
author: DS.attr (),
text: DS.attr (),
created_at: DS.attr (),
post: DS.belongsTo ('post'),
posts_breakdown: DS.belongsTo ('posts_breakdown'),
});posts.js:
export default DS.Model.extend ({
text: DS.attr (),
created_at: DS.attr (),
author: DS.attr (),
comments: DS.hasMany ('comments'),
});post_breakdown.js
export default DS.Model.extend ({
most_commented_post: DS.attr (),
last_commented_post: DS.attr (),
frequent_users: DS.attr (),
comments: DS.hasMany ('comments'),
});发布于 2018-08-30 00:07:24
好了,我已经想出了修改负载的方法,把它发送到后端。Ember有序列化程序!
遵循本指南,我可以将数据修改为有效负载,擦除它,添加它或任何我需要的:
https://guides.emberjs.com/release/models/customizing-serializers/
在我的例子中,首先我需要将关系添加到评论的模型中,如下所示:
`posts_breakdown: DS.belongsTo ('posts_breakdown')`然后使用ember-cli为comment的模型生成序列化程序:
`ember generate serializer comment`最后,进入序列化程序,如果有效负载包含进入post_breakdown关系的数据,删除它并将其传递给post关系,这样,有效负载是相同的:
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
/*
This two functions, are necesary because Ember Data changes the underscore
between variable names by dashes. In fact, it's a Ember suggestion.
*/
keyForAttribute: function (key) {
return key;
},
keyForRelationship: function (key) {
return key;
},
serialize(snapshot, options) {
let json = this._super(...arguments);
/* This makes possible to store comments when the comments-panel-loan component is used
in loan_breakdown view with post_breakdown model:
*/
if (json.data.relationships.post_breakdown.data) {
json.data.relationships.loan = {
data: {
type: "posts",
id: json.data.relationships.post_breakdown.data.id }
};
delete json.data.relationships.post_breakdown;
}
return json;
},
});https://stackoverflow.com/questions/52066506
复制相似问题