使用model
回調有一定的優勢:
- 它自動生成模型回調當你定義路由器。
- 在模板中,當您使用
link-to "someRoute" model
時,當您單擊該鏈接並轉換到另一個路線時,路線將使用您傳入的模型作爲模型(不需要調用model
回調來獲取數據)。
見http://emberjs.com/api/classes/Ember.Route.html#method_model
而且最大的優勢,我認爲,是承諾的支持。
路由使用model
回調來獲取它需要的數據,然後在setupController
中,它將數據傳遞給第二個參數。
請注意我的意思是setupController從model
獲取數據回調。如果model
回調函數返回一個promise,則該路由將等待,直到解決該promise,然後從promise中獲取數據。如果承諾正在處理,則不會調用setupController
,並且不會呈現模板。
App.PostsRoute = Em.Route.extend({
model: function() {
// The server response an array of posts like [{name: 'foo'}, {name: 'bar'}, {name: 'baz'}]
return $.get('/api/posts.json');
},
setupController: function(controller, model) {
console.log(model); // it's array, not promise object
controller.set('model', model);
}
});
當你可以使用setupController
做同樣的事情,是這樣的:
App.PostsRoute = Em.Route.extend({
setupController: function(controller, model) {
$.get('/api/posts.json').then(function(data) {
controller.set('model', data);
});
}
});
,但setupController
不支持承諾,這意味着如果你在setupController
從服務器獲取數據,數據準備之前,Ember將呈現模板。在很多情況下,這不是我們想要的。
但是,model
似乎不是從服務器獲取多個數據的好地方。您可以使用Ember.RSVP.all
來實現多個承諾。但你也需要考慮link-to
。我不知道什麼是最佳做法 以獲取路線中的多個數據,並在呈現模板之前等待它們全部準備好。如果有人有一個很好的解決方案,請告訴我!
對於你的情況,我認爲你可以使用不同的路線來做到這一點。畢竟,我認爲像「歡迎,[email protected]」是所有頁面的頂部欄,對吧?然後你可以把它放在ApplicationRoute
中,並在application.hbs
模板中渲染帳號信息。
謝謝,這是有道理的。有趣的是,即使當我實現'setupController'時,'model()'也被調用。但我可以忍受這一點。 – bluepnume