2017-10-10 92 views
0

我想從舊版API使用Ember CLI加載數據,這似乎不適合使用Ember數據。這些數據通常會在頁面加載時加載,然後在整個應用程序的許多地方重新使用。我創建了一個服務「legacy_data」這個:你可以用emberjs推遲延期服務嗎?

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    ready: null, 
    legacy_data: null, 

    init(){ 
    this.ready = Ember.$.ajax(...).done(function(legacy_data){ 
    this.set('legacy_data', legacy_data); 
    } 

    computed_attr: Ember.computed('legacy_data', function(){ ... }, 

    ...more functions and computed attributes 
}); 

因爲「初始化」功能似乎並不支持返回一個承諾(路線上喜歡的模型鉤子一樣),每當我想使用這項服務,我必須做這樣的事情:

injected_service.ready.then(function(legacy_data){ 
... use service 
}); 

這在實踐中意味着我結束了我的代碼庫一大堆額外的承諾處理 - 這種感覺就像我在游泳針對目前就這一個。

有沒有更好的方法來做到這一點?也許是一個生命週期鉤子或一個支持延遲服務初始化的工廠/初始化器,這樣我就不必擔心我的代碼庫中的其他任何地方了。初始化器是否支持這個?我沒有看到它的任何例子。是否有解決此問題的另一種方法? (Ember的數據必須以某種方式處理這個相同的問題,但我對這個框架很陌生,所以我不確定)

謝謝你的幫助。

回答

1

在Ember中,Route's有鉤子,如beforeModel,model,afterModel。如果您從這些掛鉤返回承諾,承諾處理由Ember完成。

順便說一句,即使你使用的是灰燼的數據,調用store應該途徑來完成。如果您訪問組件中的商店,則需要處理承諾。

但是,你問的方式來推遲對申請的,直到解決的承諾。這可以通過application route s beforeModel鉤子來實現。 (我需要這在我的客戶端應用程序來獲取用戶的權限。既然不能把許可承諾處理在我所有的路線,我把它放在我的application route)。所以,看看this twiddle

1

我想你應該剛剛從init勾動你的代碼的函數loadData(或任何名稱你喜歡),然後從應用程序調用路由beforeModel此功能。這將確保數據始終加載。