我有一个显示和创建帖子评论的组件,该组件有一个用于创建新评论并通过 POST 将它们发送到后端的表单,正常的有效负载是:
{
data: {
attributes: {
created_at: "foo",
autor: "foo",
text: "foo"
},
relationships: {
post: {
data: { type: "posts", id: 1234 },
id: "1234",
type: "loans"
}
},
type: "comment"
}
}
当您需要在另一个 View 中使用该组件时,更重要的是当模型名称不同时(例如 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 字段进入评论表)
我的问题
:是否有某种方法可以“欺骗”后端和/或修改有效负载,以便认为 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'),
});
最佳答案
好的,我已经找到了修改有效负载并将其发送到后端的方法。 Ember 有序列化器!
按照本指南,我可以将数据修改到有效负载中,删除它,添加它或我需要的任何内容:
https://guides.emberjs.com/release/models/customizing-serializers/
就我而言,首先我需要将关系添加到评论的模型中,在这一行中:
`posts_breakdown: DS.belongsTo ('posts_breakdown')`
然后使用 ember-cli 为评论模型生成序列化器:
`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;
},
});
关于ember.js - 将关系注入(inject) Ember 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066506/