2016-03-25 40 views
0

我有一個Ember.js(2.3)SPA。在應用程序的一部分父母的路線,我加載相當多的數據(約3.5MB)在許多不同的模型類型:Ember.js加載模板上的每個模型的承諾狀態

App.ParentRoute = Ember.Route.extend 
    model: -> 
    Ember.RSVP.hash 
     foos: @store.findAll "foo" 
     bars: @store.findAll "bar" 
     bazes: @store.findAll "baz" 
     quxes: @store.findAll "qux" 

我希望做的是增加我現有的父加載模板(目前只是一個微調器.gif),並提供有關這些承諾中每一個的狀態信息。所以,當模板呈現先它顯示每個模型類型:

[ ] Loading Foos... 
[ ] Loading Bars... 
[ ] Loading Bazes... 
[ ] Loading Quxes... 

,然後作爲RSVP.Hash每個無極結算時,它顯示爲進步的指標:

[ ] Loading Foos... 
[X] Loaded 16 Bars 
[ ] Loading Bazes... 
[X] Loaded 213 Quxes 

我看到documentation for a Route loading action但它使用的是控制器,文檔似乎表明控制器被棄用(我還沒有在項目中使用任何控制器)。

如何從加載模板中的模型()訪問Promise狀態?

回答

3

不幸的是,似乎沒有辦法通過加載子狀態實現你想要的。使用Ember.RSVP.Hash將等待所有這些承諾解決,然後再立即提供所有內容。爲了更好地控制個人承諾的呈現方式,我認爲你要找的是PromiseProxyMixin。下面是使用PromixeProxyMixin一個例子:http://blog.ksol.fr/promise-aware-controllers-and-components/

但這種灰燼插件使得與承諾以這種方式工作更容易:ember-deferred-content

您將需要調整你的模型掛鉤,打破這些異步調用出來的Ember.RSVP.Hash調用他們各自獨立,以便他們可以在不同的時間解決,彼此獨立,這樣您就可以逐一跟蹤每個承諾的狀態。

例如,你可以有一個返回類似的模型鉤:

model() { 
    return { 
    foos: @store.findAll "foo", 
    bars: @store.findAll "bar", 
    bazes: @store.findAll "baz", 
    quxes: @store.findAll "qux", 
    } 
} 

然後,使用ember-deferred-content

{{#deferred-content model.foos as |foos|}} 
    {{#foos.pending}} 
    [ ] Loading Foos... 
    {{/foos.pending}} 
    {{#foos.fulfilled as |f|}} 
    [x] Loaded {{f.length}} Foos 
    {{/foos.fulfilled}} 
{{/deferred-content}} 

...再次爲barbazqux

更新16年4月2日:

我最近了解了另一個偉大的插件,它可用於類似的效果:ember-promise-helpers。該附加組件的作者fivetanley也是Ember Data核心團隊成員。