如何通过Ember中的特定适配器进行查询?

时间:2014-04-18 04:38:11

标签: ember.js

我有一个需要组合来自多个主机的REST API的应用程序

目前我有

App.ApplicationAdapter = DS.RESTAdapter.extend
    namespace: 'api/v1'

我想做像

这样的事情
App.FooAdapter = DS.RESTAdapter.extend
    namespace: 'api/v1'
    host:  'http://myserver.com'

App.BarAdapter = DS.RESTAdapter.extend
    namespace: 'api/v1'
    host:  'http://myotherserver.com'

我试图改变

this.get('store').findAll('post')   

可以正常使用

this.get('Foo') ... etc or
this.get('FooAdapter')... etc 

但正在

无法读取属性' findAll'未定义的。我如何参考特定的适配器?

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该定义一个适配器,然后定义findfindAll做什么。

App.ApplicationAdapter = DS.Adapter.extend({

  findAll: function(store, type, id) {
    var url1 = 'http://myserver.com',
        url2 = 'http://myotherserver.com';

    return new Ember.RSVP.Promise(function(resolve, reject) {
      Em.RSVP.all([
        jQuery.getJSON(url1),
        jQuery.getJSON(url2)
      ]).then(function(arr) {
        // arr is an array containing the responses from your AJAX requests
        var someData = arr[0],
            otherData = arr[1];

        // Munge the data to get what you need for your model
        var modelData = ...

        // then return it from the method. ED will instantiate the appropriate
        // model using your data
        Ember.run(null, resolve, modelData);

      }, function(jqXHR) {
        jqXHR.then = null; // tame jQuery's ill mannered promises
        Ember.run(null, reject, jqXHR);
      });
    });
  },

  find: ...
});

您需要使用type来指定不同模型的网址。或者,您可以为每个模型定义单独的适配器。

您可能还想阅读the guide以了解有关自定义适配器的更多信息。