2015-09-23 37 views
0

我正在學習如何使用異步路由的Ember承諾,並在這裏磕磕絆絆。如果我寫我的路線,像這樣:返回承諾異步EmberJS路由的字典

App.ActivitiesRoute = Ember.Route.extend({ 
    model: function() { 
     return getClient().getActivities() 
    } 
}); 

getActivities()返回Ember.RSVP.Promise型,我可以在模板中使用:

{{#each activity in model}} 

然而,我寧可不要的我的整個基礎模型生存單一屬性。當我試試這個:

App.ActivitiesRoute = Ember.Route.extend({ 
    model: function() { 
     return { 
      activities: getClient().getActivities() 
     } 
    } 
}); 

而改變我的模板:

{{#each activity in model.activities}} 

我收到一條錯誤消息:

"Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed {_id: 82, _label: undefined, _state: undefined, _result: undefined, _subscribers: }" 

而且我不知道如何返回名爲Promise的集合可以在我的模板中單獨訪問。

回答

1

model需要返回承諾才能使基於承諾的轉換機制工作屬性。你沒有回覆承諾;你正在返回承諾的散列,這是一個完全不同的事情。您可以返回的哈希值的承諾時,其所有個人與鍵滿足Ember.RSVP.Promise.hash其滿足:

model() { 
    return Ember.RSVP.Promise.hash({ 
    activities: getClient().getActivities() 
    }); 
} 

此承諾將解決一個哈希看起來像{ activities: activities }。請記住,所有其他條件相同的情況下,您的控制器的屬性將被設置爲model。因此,在控制器和模板中,您現在需要參考model.activities

如果要等待幾個異步調用(如多次調用this.store)完成轉換開始之前,你可以用相同的哈希方法模型中的鉤:

model() { 
    return Ember.RSVP.Promise.hash({ 
    activities: getClient().getActivities(), 
    toys: this.store.findQuery('toy', type }) 
    }); 
} 

,然後設置「主」的一個作爲model控制器上setupController

setupController(controller, model) { 
    controller.set('model', model.activities); 
} 

在某些情況下,一個簡單的方法是找回在model掛鉤的主力機型,並使用afterModel檢索並等待第二個模型。

+0

感謝 - 哈希函數正是我所期待的。 –