Javascript 余烬数据JSONAPIAAdapter:获取嵌套资源
我试图让Ember数据的JSONAPIAdapter与嵌套资源一起工作。对于服务器部分,使用了django rest框架json api 我的(简化)余烬模型: case.js comment.js 服务器对Javascript 余烬数据JSONAPIAAdapter:获取嵌套资源,javascript,django,ember.js,django-rest-framework,ember-data,Javascript,Django,Ember.js,Django Rest Framework,Ember Data,我试图让Ember数据的JSONAPIAdapter与嵌套资源一起工作。对于服务器部分,使用了django rest框架json api 我的(简化)余烬模型: case.js comment.js 服务器对/api/v1/cases/4的响应如下所示: { "data": [ { "type": "cases", "id": "4", "attributes": { "first-name": "Hans",
/api/v1/cases/4
的响应如下所示:
{
"data": [
{
"type": "cases",
"id": "4",
"attributes": {
"first-name": "Hans",
"last-name": "Peter",
},
"relationships": {
"comments": {
"meta": {
"count": 1
},
"data": [
{
"type": "comments",
"id": "5"
}
],
"links": {
"related": "http://localhost:8000/api/v1/cases/4/comments"
}
}
}
}
]
}
现在,如果我正确理解了Ember数据和JSON-API规范,那么当我引用注释时,Ember应该请求/API/v1/cases/4/comments
。相反,它请求/api/v1/comments/5
,这显然返回了404
我的问题总结如下:
- 服务器响应是否符合JSON-API规范
- 如何让ember尊重嵌套的路由
额外问题:我在创建新评论时面临同样的问题-如何让余烬将
发布到/case/4/comments
而不是/comments
JSON API规范没有强制执行任何特定的URL模式,因此您尝试执行的是兼容的。然而,我发现使用平面URL结构更容易处理余烬数据,尽管有一个解决方法
您需要查看插件,并将一些逻辑从它添加到模型的适配器中
使用该插件,您可以使用app/adapters/comment.js
:
import ApplicationAdapter from './application';
import UrlTemplates from 'ember-data-url-templates';
export default ApplicationAdapter.extend(UrlTemplates, {
namespace: 'api/v1', // You may or may not need this namespace setting:
// I'm a little rusty in this area :)
urlTemplate: '{+host}/case/{caseId}/comments{/id}',
urlSegments: {
contentId: function(type, id, snapshot/*, query */) {
return snapshot.belongsTo('case', { id: true });
}
}
});
除非插件允许其他东西绕过这个问题,否则我相信这会将您锁定到URL结构中,以便在整个应用程序中发表评论。因此,在决定走这条路之前,一定要权衡一下这一权衡。JSON API规范没有强制执行任何特定的URL模式,因此您尝试执行的是兼容的。然而,我发现使用平面URL结构更容易处理余烬数据,尽管有一个解决方法
您需要查看插件,并将一些逻辑从它添加到模型的适配器中
使用该插件,您可以使用app/adapters/comment.js
:
import ApplicationAdapter from './application';
import UrlTemplates from 'ember-data-url-templates';
export default ApplicationAdapter.extend(UrlTemplates, {
namespace: 'api/v1', // You may or may not need this namespace setting:
// I'm a little rusty in this area :)
urlTemplate: '{+host}/case/{caseId}/comments{/id}',
urlSegments: {
contentId: function(type, id, snapshot/*, query */) {
return snapshot.belongsTo('case', { id: true });
}
}
});
除非插件允许其他东西绕过这个问题,否则我相信这会将您锁定到URL结构中,以便在整个应用程序中发表评论。因此,在决定走这条路线之前,一定要权衡一下这个折衷方案。是的,这是可行的,应该按如下方式设置
models/client.js
export default DS.Model.extend({
name: DS.attr('string'),
telno: DS.attr('string'),
campaigns: hasMany()
});
export default DS.Model.extend({
name: DS.attr('string'),
startdate: DS.attr('date'),
enddate: DS.attr('date'),
client: DS.belongsTo('client')
});
models/client.js
export default DS.Model.extend({
name: DS.attr('string'),
telno: DS.attr('string'),
campaigns: hasMany()
});
export default DS.Model.extend({
name: DS.attr('string'),
startdate: DS.attr('date'),
enddate: DS.attr('date'),
client: DS.belongsTo('client')
});
/模板/client/edit.bhs
名称
{{{#每个模型.活动作为|活动}
{{campaign.name}
{{/每个}}
是,此功能正常,应按如下方式设置
models/client.js
export default DS.Model.extend({
name: DS.attr('string'),
telno: DS.attr('string'),
campaigns: hasMany()
});
export default DS.Model.extend({
name: DS.attr('string'),
startdate: DS.attr('date'),
enddate: DS.attr('date'),
client: DS.belongsTo('client')
});
models/client.js
export default DS.Model.extend({
name: DS.attr('string'),
telno: DS.attr('string'),
campaigns: hasMany()
});
export default DS.Model.extend({
name: DS.attr('string'),
startdate: DS.attr('date'),
enddate: DS.attr('date'),
client: DS.belongsTo('client')
});
/模板/client/edit.bhs
名称
{{{#每个模型.活动作为|活动}
{{campaign.name}
{{/每个}}
是的,这是可行的,而且您的json看起来是正确的。您如何“引用注释”?此外,我的帖子也直接发布到评论资源。目前,我只是在模板中访问model.comments
。根据ember社区slack对此问题的反馈,有一些微妙之处与如何访问资源有关-您对此了解更多吗?假设您的模型是“案例”的实例,这看起来是正确的。我已经使用firebase和loopback完成了这项工作。不确定“微妙之处”。如果您愿意,我将添加一个带有json示例和代码示例的答案。这肯定很有趣。我还将尝试在一个最小的设置中重现这个问题。是的,这是可行的,并且您的json看起来是正确的。您如何“引用注释”?此外,我的帖子也直接发布到评论资源。目前,我只是在模板中访问model.comments
。根据ember社区slack对此问题的反馈,有一些微妙之处与如何访问资源有关-您对此了解更多吗?假设您的模型是“案例”的实例,这看起来是正确的。我已经使用firebase和loopback完成了这项工作。不确定“微妙之处”。如果您愿意,我将添加一个带有json示例和代码示例的答案。这肯定很有趣。我还将尝试在最小的设置中重现该问题。由于余烬数据目前不支持对POST
或补丁
请求的相关链接进行跟踪,如果不选择平展URL,这似乎是一种方法-谢谢!由于余烬数据目前不支持对POST
或PATCH
请求执行相关的链接,如果不选择平展URL,这似乎是一种方法-谢谢!我们决定使用ember数据url模板
方法,因为我们也需要调用POST
和补丁
的嵌套路由(请参见我上面的评论)。不管怎样,谢谢你发布这篇文章,下次当我只需要GET
时,我会尝试这种方法!我们决定使用ember数据url模板
方法,因为我们也需要调用POST
和补丁
的嵌套路由(请参见我上面的评论)。不管怎样,谢谢你发布这篇文章,下次当我只需要GET
时,我会尝试这种方法!