我想使用两个适配器,具体取决于路线。目前我有以下商店:
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.Adapter
是DS.RESTAdapter
)
但我想要的是拥有两家商店。是否有可能在逐个路线的基础上这样做?有人可以举例说明如何为此配置路由器吗?
答案 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());
}
});