Ember.js 如何从emberjs中的嵌套资源后端获取模型
如何获取Ember.js中嵌套的模型。我的意思是,我有一个叫做Ember.js 如何从emberjs中的嵌套资源后端获取模型,ember.js,Ember.js,如何获取Ember.js中嵌套的模型。我的意思是,我有一个叫做post的模型。在我的端点中,我有一个路径来获取所有帖子,并获取带有id的特定帖子。但是,例如,如果我显示一个特定的帖子,我如何才能获得与该帖子点击按钮相关的所有评论 我在后端的路由是/posts/:post\u id/comments 谢谢你可以试试插件 它允许通过url模板指定所需的url。现在,ember数据url模板正在早期开发中 // console ember install ember-data-url-template
post
的模型。在我的端点中,我有一个路径来获取所有帖子
,并获取带有id的特定帖子
。但是,例如,如果我显示一个特定的帖子
,我如何才能获得与该帖子
点击按钮相关的所有评论
我在后端的路由是/posts/:post\u id/comments
谢谢你可以试试插件
它允许通过url模板指定所需的url。现在,ember数据url模板
正在早期开发中
// console
ember install ember-data-url-templates
ember generate ember-data-url-templates
// adapters/comment.js
// add UrlTemplates mixin to your `Adapter` and specify url templates
import DS from "ember-data";
import UrlTemplates from "ember-data-url-templates";
export default DS.RESTAdapter.extend(UrlTemplates, {
urlTemplate: '{+host}/posts/{postId}/comments{/id}',
urlSegments: {
postId(type, id, snapshot, query) {
return snapshot.belongsTo('post', { id: true });
}
}
});
你可以试试插件
它允许通过url模板指定所需的url。现在,ember数据url模板
正在早期开发中
// console
ember install ember-data-url-templates
ember generate ember-data-url-templates
// adapters/comment.js
// add UrlTemplates mixin to your `Adapter` and specify url templates
import DS from "ember-data";
import UrlTemplates from "ember-data-url-templates";
export default DS.RESTAdapter.extend(UrlTemplates, {
urlTemplate: '{+host}/posts/{postId}/comments{/id}',
urlSegments: {
postId(type, id, snapshot, query) {
return snapshot.belongsTo('post', { id: true });
}
}
});
我发现访问嵌套资源的最佳方法(如果可以修改API的话)是让API在json中返回一个“links”属性以供注释。例如,返回的json如下所示:
{
"post": {
"id": 1,
"links": {
"comments": "http://localhost:3000/posts/1/comments"
}
}
}
现在,您可以在ember应用程序中定义关系,并在路线中获取模型:
// models/post.js
import DS from 'ember-data';
export default DS.Model.extend({
comments: DS.hasMany('comments', {async: true});
});
// models/comment.js
import DS from 'ember-data';
export default DS.Model.extend({
post: DS.belongsTo('post', {async: true});
});
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.find('post', params.post_id);
}
});
现在,当您在模板中调用
{{#each model.comments as |comment|}}
{{comment.comment_attribute}}
{{/each}}
Ember将在/posts/:post_id/comments处发出异步请求并获取评论。如果您希望在请求发生时显示加载图标或其他内容,可以将其包装在
{{#if model.comments}}
{{#each model.comments as |comment|}}
{{comment.comment_attribute}}
{{/each}}
{{else}}
<!-- Something to do while loading -->
{{/if}}
我发现访问嵌套资源的最佳方法(如果可以修改API的话)是让API在json中返回一个“links”属性以供注释。例如,返回的json如下所示:
{
"post": {
"id": 1,
"links": {
"comments": "http://localhost:3000/posts/1/comments"
}
}
}
现在,您可以在ember应用程序中定义关系,并在路线中获取模型:
// models/post.js
import DS from 'ember-data';
export default DS.Model.extend({
comments: DS.hasMany('comments', {async: true});
});
// models/comment.js
import DS from 'ember-data';
export default DS.Model.extend({
post: DS.belongsTo('post', {async: true});
});
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.find('post', params.post_id);
}
});
现在,当您在模板中调用
{{#each model.comments as |comment|}}
{{comment.comment_attribute}}
{{/each}}
Ember将在/posts/:post_id/comments处发出异步请求并获取评论。如果您希望在请求发生时显示加载图标或其他内容,可以将其包装在
{{#if model.comments}}
{{#each model.comments as |comment|}}
{{comment.comment_attribute}}
{{/each}}
{{else}}
<!-- Something to do while loading -->
{{/if}}
您可以在rest适配器中创建自定义构建URL
我当前正在使用的我的(仅用于/posts/:post\u id/comments
)
您可以在rest适配器中创建自定义构建URL
我当前正在使用的我的(仅用于/posts/:post\u id/comments
)
使用JSON API 1.0规范进一步扩展@filby的答案,该规范使用了新的JSONAPIAdapter
,下面的代码可以工作
来自服务器的单个Post响应
'data': {
'type': 'posts',
'id': 1,
'attributes': {
'title:'A new post'
},
'relationships': {
'comments': {
'links':{
'related': '/api/posts/1/comments'
}
}
}
}
后期模型
// models/post.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';
export default Model.extend({
title: attr('string')
comments: hasMany('comments');
});
// models/comment.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';
export default Model.extend({
post: belongsTo('post', {async: true});
likes: attr('number')
});
评论模型
// models/post.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';
export default Model.extend({
title: attr('string')
comments: hasMany('comments');
});
// models/comment.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';
export default Model.extend({
post: belongsTo('post', {async: true});
likes: attr('number')
});
邮政路线
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.findRecord('post', params.post_id);
}
});
{{#each model.comments as |comment|}}
{{comment.likes}}
{{/each}}
帖子模板
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.findRecord('post', params.post_id);
}
});
{{#each model.comments as |comment|}}
{{comment.likes}}
{{/each}}
注释请求将是/api/posts/1/comments
,它在相关的属性中指定。使用JSON api 1.0规范进一步扩展@filby的答案,该规范使用了新的JSONAPIAdapter
,下面的代码可以工作
来自服务器的单个Post响应
'data': {
'type': 'posts',
'id': 1,
'attributes': {
'title:'A new post'
},
'relationships': {
'comments': {
'links':{
'related': '/api/posts/1/comments'
}
}
}
}
后期模型
// models/post.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';
export default Model.extend({
title: attr('string')
comments: hasMany('comments');
});
// models/comment.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';
export default Model.extend({
post: belongsTo('post', {async: true});
likes: attr('number')
});
评论模型
// models/post.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';
export default Model.extend({
title: attr('string')
comments: hasMany('comments');
});
// models/comment.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';
export default Model.extend({
post: belongsTo('post', {async: true});
likes: attr('number')
});
邮政路线
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.findRecord('post', params.post_id);
}
});
{{#each model.comments as |comment|}}
{{comment.likes}}
{{/each}}
帖子模板
// post.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
return this.store.findRecord('post', params.post_id);
}
});
{{#each model.comments as |comment|}}
{{comment.likes}}
{{/each}}
评论请求将是/api/posts/1/comments
,它在相关的属性中指定。您可以发布一些您尝试过的代码吗?有几种方法可以做到这一点。据我所知,没有直接的方法来处理嵌套资源api。关于嵌套资源api支持的讨论由来已久:。如果您管理后端,您可能会发现更改后端api以避免使用嵌套资源更简单。嵌套是指嵌入?您可以发布一些您尝试过的代码吗?有几种方法可以做到这一点。据我所知,没有直接的方法来处理嵌套资源api。关于嵌套资源api支持的讨论由来已久:。如果您管理后端,您可能会发现更改后端api以避免使用嵌套资源更简单。嵌套是指嵌入?这仍然是我们应该做的吗?如果我是您,我会提交PR以更新ember data 2.0的“ember数据url模板”。我确信只有一些词需要改变。我想,但我上周才开始使用余烬。似乎有点早。:)同意:)我会在周末看看这个。FWIW:我已经在生产中使用了约6个月的余烬数据url模板。如果您最终尝试了它并遇到任何问题,请告诉我:)这仍然是我们应该做的事情吗?如果我是您,我会提交PR以更新ember data 2.0的“ember数据url模板”。我确信只有一些词需要改变。我想,但我上周才开始使用余烬。似乎有点早。:)同意:)我会在周末看看这个。FWIW:我已经在生产中使用了约6个月的余烬数据url模板。如果您最终尝试并遇到任何问题,请告诉我:)