Ember.js / Ember-Data:使用RESTAdapter从多个端点加载数据

时间:2014-05-13 15:27:15

标签: javascript ember.js ember-data

我有一个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

感谢任何帮助。

1 个答案:

答案 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*的任何调用,我对酒吧的模拟响应总是返回相同的事情

http://emberjs.jsbin.com/OxIDiVU/481/edit