在ember商店中动​​态选择ember适配器

时间:2016-01-11 17:57:57

标签: ember.js ember-data

是否可以在ember商店或Ember应用程序的其他地方动态选择适配器?我正在为我的ember应用程序实现离线行为,当离线时,应用程序应该利用离线适配器从浏览器存储中提取数据。

这个逻辑的最佳位置在哪里?

我知道DS.Store上有一个适配器属性,您可以在其中指定自定义适配器(http://emberjs.com/api/data/classes/DS.Store.html#property_defaultAdapter),但我无法使其工作。

示例:

应用程序/适配器/ custom.js

import Ember from 'ember';
import DS from 'ember-data';

export default DS.Store.extend({

  adapter: 'custom',
});

应用程序/ store.js

import Ember from 'ember';
import DS from 'ember-data';

export default DS.Adapter.extend({

  pathForType: function(type) {
    debugger; //Never goes in here
  },
});

我期待的是这样的事情:

export default DS.Store.extend({
  offlineService: Ember.inject.service('offlineService') //Service to detect if app has network connection      

  adapter: function() {
    if (this.get('offlineService.isOffline') {
      return 'offlineAdapter'
    } else {
      return 'application'
    }
  }.property('offlineService.isOffline')
});

是否有可能沿着这些方向发展?

谢谢!

1 个答案:

答案 0 :(得分:1)

今天最简单的方法是覆盖adapterFor方法:

export default DS.Store.extend({
  offlineService: Ember.inject.service('offlineService') //Service to detect if app has network connection      

  adapterFor(modelName) {
    if (this.get('offlineService.isOffline') {
      return this.offlineAdapterFor(modelName);
    } else {
      return this._super(modelName); // use default logic, i.e. adapters/<modelname> file
    }
  },

  offlineAdapterFor(modelName) {
    // your logic here ...
  }
});

注意:这是一个私有API。无法保证这将在未来版本的Ember Data中继续有效。

文档: http://emberjs.com/api/data/classes/DS.Store.html#method_adapterFor