Моя цель - показать на моей странице графический рисунок "loading...", в то время как Ember выбирает данные модели по маршруту Ember.
Это привело меня к http://emberjs.com/guides/routing/loading-and-error-substates/. Это побудило меня создать действие на моем контролере страницы, в котором будет отображаться окно загрузки "Загрузка" в DOM. Например, здесь мой контроллер:
Контроллеры /users.js:
export default Ember.ArrayController.extend({
...
actions: {
displayLoading: function() {
// Show the DOM element that says "Loading..."
},
...
}
});
Я хотел бы назвать это, пока мои данные загружаются, поэтому я определяю маршрут следующим образом:
маршруты /users.js:
export default Ember.Route.extend({
model: function( params ) {
return this.store.find('user', params );
},
actions: {
loading: function(transition, originRoute) {
transition.send('displayLoading');
}
}
});
Но когда я это сделаю, я получаю эту ошибку:
Uncaught Error: Nothing handled the action 'displayLoading'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.
Итак, мой вопрос: , где я могу определить это действие, чтобы мой метод loading
мог его называть?
Обратите внимание, что попытка this.send('displayLoading')
дала мне эту ошибку:
Can't trigger action 'displayLoading' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call .send() on the Transition object passed to the model/beforeModel/afterModel hooks.
.
Обновление: Я могу поймать это действие на самом маршруте, но затем я все еще не могу вызвать действие на своем контроллере.
Обновление # 2: Благодаря ответу @kingpin2k, я решил это. Для заинтересованных, вот полное решение:
Контроллеры /users.js:
export default Ember.ArrayController.extend( {
actions: {
showLoading: function() {
this.set('isLoading', true);
},
hideLoading: function() {
this.set('isLoading', false);
},
}
});
маршрутизаторы /users.js:
export default Ember.Route.extend({
model: function( params ) {
return this.store.find('user', params );
},
actions: {
loading: function() {
this.controllerFor('users').send('showLoading');
},
didTransition: function() {
this.controllerFor('users').send('hideLoading');
}
}
});
Ключевое понимание заключалось в том, что я могу установить свойство isLoading
на моем контроллере, которое определяет, показывает ли мое модальное окно "Загрузка..." в шаблоне Handlebars.