【问题标题】:How to use two different adapters at the same time in Ember.js application?如何在 Ember.js 应用程序中同时使用两个不同的适配器?
【发布时间】:2015-09-11 09:26:44
【问题描述】:

我正在为一个 API 使用基本适配器:

App.Store = DS.Store.extend({
    revision: 12,
    adapter: DS.BasicAdapter.create()
});

假设我需要使用 REST API 从其他服务检索一些数据:

App.Store2 = DS.Store.extend({
    revision: 12,
    adapter: DS.RESTAdapter.create()
});

那么store2怎么用呢?还是有其他方法可以解决此类问题?

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    您可以添加两个不同的适配器,无需创建多个商店。

    对于 Ember 2:

    可以通过将您的适配器类放在应用程序的 app/adapters/ + 模型名称 + .js 文件中来创建特定于模型的适配器。

    来源:DS.Adapter Class

    【讨论】:

      【解决方案2】:

      当您需要使用不同的 Store 时,请定义您的 Store,然后指定您要检索的 Model:

      App.Store = DS.Store.extend({
        revision: 12,
        adapter: DS.BasicAdapter.create()
      });
      
      App.store2 = DS.Store.create({
        revision: 12,
        adapter: DS.RESTAdapter.create()
      });
      
      // retrieving from custom store
      var myModelObject = App.store2.find(App.MyDifferentModel, 1);
      
      // retrieving from defaultStore is implicit for the Models defined
      var post = App.Post.find(1);
      

      希望对你有帮助

      【讨论】:

      • 但是在将 API 映射到模型时,我如何告诉它使用不同的商店?喜欢:var Post = DS.Model.extend({title: DS.attr('string')}); 等。
      • revision: 12 的意义是什么,这样跟踪版本似乎有点奇怪。
      • 我尝试了上述解决方案(App.store2),但它在当前的 Ember 中不起作用(ember.js 1.5.1,ember-data.js 1.0.0-beta.8)。 @intuitivepixel
      • 这对我也不起作用,当我引用 store2 时出现错误Cannot read property 'lookupFactory' of undefined TypeError: Cannot read property 'lookupFactory' of undefined
      • 我也想做类似的事情;但据我所知,这不再起作用了。 store2 创建的模型将被放入等待保存队列;当队列运行时,它将有机会找到一个 model 特定的适配器;否则它将使用后备适配器。 https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store.js#L2141 中的代码非常清晰。但是,您可以尝试覆盖自定义商店的 adapterFor 方法(不确定它是否会起作用)。
      【解决方案3】:

      这就是我使上述示例工作的方式,注意我使用ember-cli。 我没有使用DS.RESTAdapter.create() 创建我的商店,或者在我的情况下,我使用DS.LSAdapter,而是在这样的初始化程序中创建我的商店:

      app.LsStore = DS.Store.extend({
        adapter: '-ls',
      });
      
      app.register('store:lsstore', app.LsStore);
      app.register('adapter:-ls', DS.LSAdapter);
      

      这基本上在容器上注册了一个lsstore 和一个adapter:-ls。然后我可以将我的商店注入应用程序的routecontroller,这将尝试使用adapter:-ls 找到适配器。

      【讨论】:

        猜你喜欢
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多