【问题标题】:Ember.js/Ember-Data: Using the RESTAdapter to load data from multiple endpointsEmber.js/Ember-Data:使用 RESTAdapter 从多个端点加载数据
【发布时间】:2014-05-13 15:27:14
【问题描述】:

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

例如,假设我有两个相关资源:

  • Topics
  • Posts

Topics 拥有许多Posts,而Posts 属于Topic

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

"topic": {
  "id": ...,
  "title": ...,
  "author": ...
},

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

正如我在文章开头提到的,我的 API 没有这样做。它将在一次调用中返回Topic 数据,并在第二次调用中返回TopicPosts 数据。更改我的 API 以完全按照 Ember 的要求工作不是一种选择。

我的问题是,如何扩展/覆盖 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);
  });
}

感谢任何帮助。

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案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* 的任何调用如何,我对 bar 的模拟响应总是返回相同的内容

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

    【讨论】:

    • 啊,谢谢!我之前尝试过 async 属性,但我认为我的序列化程序中有错误。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多