3

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

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

但我想要的是有两家商店。是否有可能在逐条路线的基础上做到这一点?有人可以提供一个关于如何为此配置路由器的示例吗?

4

3 回答 3

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.RESTAdapterDS.FixtureAdapter当您还不想与后端通信时使用,但会将您的数据作为“夹具”存储在客户端中。

希望能帮助到你。

于 2013-06-24T12:07:31.410 回答
5

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

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

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

App.LegacyAdapter = DS.FixtureAdapter;
于 2013-12-28T20:47:47.713 回答
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());
    }
});
于 2013-09-03T03:36:39.577 回答