2012-05-16 70 views
4

我有一個應用程序使用餘燼數據persit數據和StateManager驅動其全局狀態。因爲加載數據是異步的,所以我想知道如何捕獲表示所有數據都被加載的事件。 準確地說,我的狀態爲「加載」在那裏我與加載數據:Ember數據和Ember狀態管理器

App.store.find(App.Model, ....) 

當加載一個模型,我做一些後期處理。這是在名爲「後處理」的「加載」子狀態下完成的。我過渡到「後處理」當每一個MODELE患上了「didLoad」事件:

App.Model = DS.Model.extend { 
    didLoad: -> 
    stateManager.send('postProcess',this) 
} 

當每一個數據加載和後處理,應用程序應該過渡到另一種狀態「編輯」,也就是在同一水平「加載「:

 loading -> postprocessing 
root/
    \ 
     editing 

我應該抓住什麼事件來使過渡發生?這個ember-data Store有回調嗎?

回答

0

嘗試觀察「[email protected]」並調用模型的arrayController中的stateManager.sent(「編輯」)。例如:

App.ModelArrayController.reopen({ 
    didLoadAllContent: function() { 
     if (content.everyProperty('isLoaded')) { 
      stateManager.transitionTo('editing'); 
     } 
    }.observes("[email protected]") 
)} 

當然可能是一種更簡單的方法。或者更正確的一個...

5

當使用ember-data時,find方法返回一個數組代理。您可以觀察該對象上的isLoaded字段。

var data = App.store.find(App.Model, {}); 
data.addObserver('isLoaded', function() { 
    if (data.get('isLoaded')) { 
     .... 
    } 
}); 

但記住要通過removeObserver清理你的觀察者。

我將此實用程序添加到內置的ember-data記錄數組中。

​​

所以,現在你可以做

App.store.find(App.Model, {}).onLoad(function(data) { 
    .... 
}); 

你也可以這樣做

init: function() { 
    this.set('data', App.store.find(App.model, {})); 
}, 

onData: function() { 
    if (this.get('data.isLoaded')) { 
     ... 
    } 
}.observes('data.isLoaded')