同时使用DS.FixtureAdapter和DS.RESTAdapter

时间:2013-06-24 06:03:58

标签: ember.js

我想使用两个适配器,具体取决于路线。目前我有以下商店:

if (window.USE_FIXTURES) { var my_adapter = 'DS.FixtureAdapter'; }
else                     { var my_adapter = SettingsApp.Adapter.create(); }

SettingsApp.Store = DS.Store.extend({
    revision: 12,
    adapter:  my_adapter
});

SettinsApp.AdapterDS.RESTAdapter

但我想要的是拥有两家商店。是否有可能在逐个路线的基础上这样做?有人可以举例说明如何为此配置路由器吗?

3 个答案:

答案 0 :(得分:6)

  

但我想要的是拥有两家商店。是否有可能在逐个路线的基础上做到这一点?

根据设计,您永远不应该在您的应用中拥有多个商店。但是,存在以每个模型为基础的适配器的可能性。

这看起来像这样:

DS.Store.registerAdapter('App.LegacyModel', App.MyLegacyAdapter.extend({});

如果您有多个使用相同适配器的型号,您可以这样做:

DS.Store.registerAdapter(['App.FooModel', 'App.BarModel'], App.MyAdapter.extend({});

然后,商店将在发出请求时使用模型类型对应的适配器。

您仍然可以使用以下语法为商店指定默认适配器

App.Store = DS.Store.extend({
  adapter: 'DS.RESTAdapter'
});

如果您尝试加载没有为其类型指定适配器的记录,则此默认适配器将用作后备。

  

是否可以逐个路线地执行此操作?

遵循最佳做法,如果您想使用不同于常规查找的模型(例如使用您的路线名称),您可以执行以下操作:

App.SomeRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    controller.set('model', App.MySpecialModel.find());
  }
});

另外值得一提的是,DS.FixtureAdapter不会替换也不具有与DS.RESTAdapter相同的功能集,它只是为您的应用提供简单的模型数据,因此适配器之间的切换不起作用如果是DS.FixtureAdapter& DS.RESTAdapter。当您还不关心与后端通信时使用DS.FixtureAdapter,但会将您的数据存储为客户端中的“固定装置”。

希望它有所帮助。

答案 1 :(得分:5)

@ intuitivepixel的回答在当天的Ember(v1.0 +)中不再有效;因为在API中不再存在registerAdapter。

现在您可以为要覆盖适配器选择的每个模型声明一个适配器:

App.LegacyModel = DS.Model.extend({
    name: DS.attr('string'),
});

App.LegacyAdapter = DS.FixtureAdapter;

答案 2 :(得分:0)

@gonvaled可能是因为你使用了

DS.Store.registerAdapter('App.LegacyModel', App.MyLegacyAdapter.extend({});

而不是

App.Store.registerAdapter('App.LegacyModel', App.MyLegacyAdapter.extend({});

我添加了同样的问题,并且通过使用App.Sotre,它已经全部修复了。

对于我的用例,我需要2个不同的适配器用于同一型号。要保存从其余适配器查看的所有产品,使用夹具适配器和sql lite在历史记录页面上脱机显示。

App.Store = DS.Store.extend({
    revision: 13,
    adapter: DS.RESTAdapter.create({
        url: app.apiUrl,
        namespace: app.apiNamespace
    })
});


App.Product = DS.Model.extend({
    name: DS.attr('string'),
});

App.Producthistory = App.Product;

App.Store.registerAdapter('App.Producthistory', DS.FixtureAdapter);

App.HistoriqueRoute = Ember.Route.extend({
    setupController: function(controller, model) {
    controller.set('model', App.Producthistory.find());
    }
});