2012-05-16 68 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')