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

Ember.js/Ember-Data: Using the RESTAdapter to load data from multiple endpoints

本文关键字:端点 加载 数据 RESTAdapter js Ember-Data 使用 Ember      更新时间:2023-09-26

我有一个API,每次返回一个资源。

作为一个例子,假设我有两个相关的资源:

  • Topics
  • Posts

Topics hasMany Posts, and Posts belongsTo a Topic .

根据文档(以及我尝试过并一直在阅读的所有内容),Ember-Data期望API的JSON类似于以下内容,其中Topic的数据和Posts的数据同时提供。

"topic": {
  "id": ...,
  "title": ...,
  "author": ...
},
"posts": [{
  "id": ...,
  "commenter": ...,
  "text": ...
}, {
  "id": ...,
  "commenter": ...,
  "text": ...
}]

正如我在文章开头提到的,我的API不能做到这一点。它将在一次调用中返回Topic数据,并在第二次调用中返回TopicPosts数据。改变我的API的工作方式烬希望它不是一个选项。

我的问题是,我如何在Ember-Data中扩展/覆盖RESTAdapter和RESTSerializer来支持从多个API调用加载数据?这可能吗?

我试着遵循这个例子,但看起来这里的数据已经加载(它试图侧载系统已经知道的数据):http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/

我还试图覆盖ApplicationSerializerextractFindAll函数,但无法弄清楚如何让应用程序的其余部分(没有双关语)等待所有关系加载。我遍历模型上的所有关系,并加载它们的数据,但是我没有看到将数据传送回原始有效负载的方法:

extractFindAll: function (store, type, payload, id, requestType) {
  var promises = [];
  type.eachRelationship(function (key, relationship) {
    promise.push(Ember.RSVP.Promise(function (resolve, reject) {
      this.store.find(key, payloadEntry[key]);
    }));
  });
  // can't figure out how to get the relationship payloads
  // back to the original payload
  Ember.RSVP.addSettled(promises).then(function () { 
    return this._super(store, type, payload, id, requestType);
  });
}

这就是async属性的用法。

模型
App.Foo = DS.Model.extend({
  bars: DS.hasMany('bar', {async: true});
})

App.Bar = DS.Model.extend({
  baz: DS.attr()
})
<<h2>适配器/h2>
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    
});
  • 如果你不做任何自定义,你不需要定义其他序列化器,它们将使用与它们使用的适配器相关联的默认序列化器。

例子

重要的是要注意,我很懒,我对bars的模拟响应总是返回相同的东西,无论对/bar*的任何调用

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