ember.js,如何在从不支持旁加载的服务器加载主模型时加载相关模型
ember.js, How do I load related models while loading main model from server that is not support sideloading
我是 ember.js
新手,每天都会遇到问题:-)
今天的问题是我的服务器后端不支持 sideloading。 (如果我理解 'sideload' 正确,它是服务器 returns 相关模型同时具有多个 JSON 根)
例如,我的服务器每个请求仅 returns 以下:
对于/api/v1/posts.json
{
posts: [{
id: 91,
title: "ember.js"
}, {
id: 81,
title: "ember-data.js"
}]
}
对于/api/v1/comments.json
{
comments: [{
id: 928,
postId: 91,
}, {
id: 927,
postId: 92,
}]
}
当我加载 post
模型时,转到 /#/posts
,视图没有呈现 comment
但是如果我通过键入 URL 手动加载 comment
comment route
地址栏,/#/comments
,返回,评论正常显示
所以我就这样尝试,在post route
,(第三行)
App.PostsRoute = Ember.Route.extend({
model: function(params) {
this.store.find('comment');
return this.store.find('post');
}
})
而且有效! (也加载和填充评论!)但我认为这是不正确的方式。
有什么好的或正确的方法可以做到这一点吗?
编辑 -- 添加模型定义
我的 post 模型是这样的:
App.Post = DS.Model.extend({
title: DS.attr('string'),
content: DS.attr('string'),
comments: DS.hasMany('comment', {async: true}),
})
评论模型为:
App.Account = DS.Model.extend({
content: DS.attr('string'),
post: DS.belongsTo('post'),
})
我不使用 ember-cli
,我从 ember-starter-kit
开始,并在主页和网络上观看了一些教程。
而且,我使用自定义 Adapter
因为我的后端实际上不支持 ember 样式 JSON 响应并且我无法触摸它:
App.SpinAdapter = DS.ActiveModelAdapter.extend({
host: 'http://spin.example.com:8080',
namespace: 'api/v1',
init: function() {
this._super();
console.log('SpinAdapter...');
}
});
App.SpinSerializer = DS.ActiveModelSerializer.extend({
extract: function(store, type, payload, id, requestType) {
console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
return payload;
},
});
App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({});
App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({});
在编辑问题后思考更多的时候找到了答案!
问题是覆盖了 extract
方法。 (有关我上一个问题的详细信息,)
当我覆盖整个 extract
作为问题的答案时,我发现某些方法没有被调用。 (也许 _super.extract
做了更多其他事情。)所以我只是用每个模型 extract
进行了测试,并调用了 super
。并且有效!
更改的 extract
方法是:
App.SpinAdapter = DS.ActiveModelAdapter.extend({
host: 'http://spin.example.com:8080',
namespace: 'api/v1',
init: function() {
this._super();
console.log('SpinAdapter...');
}
});
App.SpinSerializer = DS.ActiveModelSerializer.extend({
extract: function(store, type, payload, id, requestType) {
console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
return this._super(store, type, payload, id, requestType);
},
});
App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({
extract: function(store, type, payload, id, requestType) {
return this._super(store, type, {posts: payload}, id, requestType);
},
});
App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({
extract: function(store, type, payload, id, requestType) {
return this._super(store, type, {comments: payload}, id, requestType);
},
});
问题已解决。但遗憾的是,由于 posts
的响应没有关于 comments
的条目,(数据库和 API 结构是 "only child knows their parent")如果我先加载 post,然后相关评论未加载。
一半的解决方案。
我刚刚尝试使用嵌套路由并希望自动加载嵌套 URL,但它没有发生。 :-(
我是 ember.js
新手,每天都会遇到问题:-)
今天的问题是我的服务器后端不支持 sideloading。 (如果我理解 'sideload' 正确,它是服务器 returns 相关模型同时具有多个 JSON 根)
例如,我的服务器每个请求仅 returns 以下:
对于/api/v1/posts.json
{
posts: [{
id: 91,
title: "ember.js"
}, {
id: 81,
title: "ember-data.js"
}]
}
对于/api/v1/comments.json
{
comments: [{
id: 928,
postId: 91,
}, {
id: 927,
postId: 92,
}]
}
当我加载 post
模型时,转到 /#/posts
,视图没有呈现 comment
但是如果我通过键入 URL 手动加载 comment
comment route
地址栏,/#/comments
,返回,评论正常显示
所以我就这样尝试,在post route
,(第三行)
App.PostsRoute = Ember.Route.extend({
model: function(params) {
this.store.find('comment');
return this.store.find('post');
}
})
而且有效! (也加载和填充评论!)但我认为这是不正确的方式。
有什么好的或正确的方法可以做到这一点吗?
编辑 -- 添加模型定义
我的 post 模型是这样的:
App.Post = DS.Model.extend({
title: DS.attr('string'),
content: DS.attr('string'),
comments: DS.hasMany('comment', {async: true}),
})
评论模型为:
App.Account = DS.Model.extend({
content: DS.attr('string'),
post: DS.belongsTo('post'),
})
我不使用 ember-cli
,我从 ember-starter-kit
开始,并在主页和网络上观看了一些教程。
而且,我使用自定义 Adapter
因为我的后端实际上不支持 ember 样式 JSON 响应并且我无法触摸它:
App.SpinAdapter = DS.ActiveModelAdapter.extend({
host: 'http://spin.example.com:8080',
namespace: 'api/v1',
init: function() {
this._super();
console.log('SpinAdapter...');
}
});
App.SpinSerializer = DS.ActiveModelSerializer.extend({
extract: function(store, type, payload, id, requestType) {
console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
return payload;
},
});
App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({});
App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({});
在编辑问题后思考更多的时候找到了答案!
问题是覆盖了 extract
方法。 (有关我上一个问题的详细信息,
当我覆盖整个 extract
作为问题的答案时,我发现某些方法没有被调用。 (也许 _super.extract
做了更多其他事情。)所以我只是用每个模型 extract
进行了测试,并调用了 super
。并且有效!
更改的 extract
方法是:
App.SpinAdapter = DS.ActiveModelAdapter.extend({
host: 'http://spin.example.com:8080',
namespace: 'api/v1',
init: function() {
this._super();
console.log('SpinAdapter...');
}
});
App.SpinSerializer = DS.ActiveModelSerializer.extend({
extract: function(store, type, payload, id, requestType) {
console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
return this._super(store, type, payload, id, requestType);
},
});
App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({
extract: function(store, type, payload, id, requestType) {
return this._super(store, type, {posts: payload}, id, requestType);
},
});
App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({
extract: function(store, type, payload, id, requestType) {
return this._super(store, type, {comments: payload}, id, requestType);
},
});
问题已解决。但遗憾的是,由于 posts
的响应没有关于 comments
的条目,(数据库和 API 结构是 "only child knows their parent")如果我先加载 post,然后相关评论未加载。
一半的解决方案。
我刚刚尝试使用嵌套路由并希望自动加载嵌套 URL,但它没有发生。 :-(