【问题标题】:Dynamically choose ember adapter in ember store在 ember 商店中动态选择 ember 适配器
【发布时间】:2016-01-11 17:57:56
【问题描述】:

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

把这个逻辑放在哪里最好?

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

例子:

app/adapters/custom.js

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

export default DS.Store.extend({

  adapter: 'custom',
});

app/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')
});

类似的事情有可能吗?

谢谢!

【问题讨论】:

  • 如果您想要强大的离线行为,请考虑ServiceWorker。否则,我认为您正在适配器中寻找 if 语句。

标签: ember.js ember-data


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多