2016-01-11 105 views
0

是否可以在餘燼商店或Ember App中的其他地方動態選擇適配器?我正在爲我的應用程序應用程序執行脫機行爲,脫機時,應用程序應該使用脫機適配器從瀏覽器存儲中提取數據。在餘燼商店動態選擇餘燼適配器

哪裏會放置這個邏輯的最佳地點?

我知道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') 
}); 

沿着這些線條甚至有可能發生什麼?

謝謝!

+0

如果你想強大的離線行爲考慮'ServiceWorker'。否則,我認爲你正在尋找適配器中的'if'語句。 –

回答

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

+0

完全合理。 'adaptorFor'和'serializerFor'剛剛成爲公共方法! https://github.com/emberjs/data/pull/3941 – Justin