model
Использование обратного вызова имеет ряд преимуществ:
- Он автоматически генерировать модели обратного вызова при определении маршрутизатора.
- В шаблоне, когда вы используете
link-to "someRoute" model
, при нажатии этой ссылки и переходе на другой маршрут маршрут будет использовать модель, которую вы передаете для своей модели (без вызова model
callback для получения данных).
См http://emberjs.com/api/classes/Ember.Route.html#method_model
Но самое большое преимущество, я думаю, это поддержка обещание.
Маршрут использует обратный вызов model
для получения необходимых ему данных, затем в setupController
он передает данные во второй аргумент.
Обратите внимание, что я имею в виду setupController получает данные от model
callback. Если обратный вызов model
возвращает обещание, маршрут будет ждать, пока это обещание не будет устранено, а затем получите данные от обещания. Если обещание обрабатывается, 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
. Я не уверен, что является наилучшей практикой для получения нескольких данных в маршруте и ждать их подготовки до создания шаблона. Если у кого есть хорошее решение, скажите, пожалуйста!
Для вашей ситуации, я думаю, вы можете использовать другой маршрут для этого. В конце концов, я думаю, что что-то вроде «Welcome, [email protected]» является верхней панелью для всех страниц, не так ли? Затем вы можете поместить его в ApplicationRoute
и отобразить информацию об учетной записи в шаблоне application.hbs
.
Спасибо, это имеет смысл. Интересно, что 'model()' вызывается, даже когда я реализую 'setupController'. Но я могу жить с этим. – bluepnume