我有一个API,一次返回一个资源。
举个例子,假设我有两个相关的资源:
Topics
Posts
Topics
hasMany Posts
,而Posts
属于Topic
。
根据文档(以及我尝试过并且一直在阅读的所有内容),Ember-Data希望API中的JSON与以下类似,其中Topic
的数据和同时提供Posts
的数据。
"topic": {
"id": ...,
"title": ...,
"author": ...
},
"posts": [{
"id": ...,
"commenter": ...,
"text": ...
}, {
"id": ...,
"commenter": ...,
"text": ...
}]
正如我在帖子开头提到的那样,我的API不会这样做。它会在一次调用中返回Topic
数据,在第二次调用中返回Posts
的{{1}}数据。改变我的API以确定Ember想要它的方式不是一种选择。
我的问题是,如何在Ember-Data中扩展/覆盖RESTAdapter和RESTSerializer以支持从多个API调用加载数据?这甚至可能吗?
我尝试过这个例子,但看起来这里的数据已经加载了(它试图加载已经为系统所知的数据):http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/
我还尝试覆盖Topic
的{{1}}函数,但无法弄清楚如何让应用程序的其余部分(没有双关语)等待所有关系到加载。我遍历模型上的所有关系,并加载他们的数据,但我没有看到将数据传回原始有效载荷的方法:
extractFindAll
感谢任何帮助。
答案 0 :(得分:1)
这完全描述了使用async
属性。
App.Foo = DS.Model.extend({
bars: DS.hasMany('bar', {async: true});
})
App.Bar = DS.Model.extend({
baz: DS.attr()
})
App.FooAdapter = DS.RESTAdapter.extend({
//anything custom
});
App.BarAdapter = DS.RESTAdapter.extend({
//anything custom
});
App.ApplicationAdapter = DS.RESTAdapter;
定义为网站范围的适配器。App.FooSerializer = DS.RESTSerializer.extend({
//anything custom
});
App.BarSerializer = DS.RESTSerializer.extend({
//anything custom
});
重要的是要注意,我是懒惰的,无论对/bar*
的任何调用,我对酒吧的模拟响应总是返回相同的事情