Действие Ember.js для контроллера
Когда я использую Ember Router, как я могу определить действия в шаблоне, которые подключены к контроллеру?
Пример здесь: http://jsfiddle.net/KvJ38/3/
Unter My Profile - это два действия: одно определено в состоянии и работает, два определено в контроллере. Как я могу заставить это работать или я должен использовать другой подход?
App.Router = Em.Router.extend({
enableLogging: true,
location: 'hash',
root: Em.State.extend({
// EVENTS
goHome: Ember.State.transitionTo('home'),
viewProfile: Ember.State.transitionTo('profile'),
// STATES
home: Em.State.extend({
route: '/',
connectOutlets: function(router, context) {
var appController = router.get('applicationController');
appController.connectOutlet(App.HomeView);
}
}),
// STATES
profile: Em.State.extend({
route: '/profile',
connectOutlets: function(router, context) {
var appController = router.get('applicationController');
appController.connectOutlet(App.ProfileView);
}
}),
one: function() {
alert("eins");
},
})
});
3 ответа
По умолчанию целью действия является маршрутизатор, но вы можете определить другое в шаблоне:
{{action two target="controller"}}
И добавьте функцию "два" в "App.ProfileController".
ОБНОВИТЬ
Надеемся, что этот ответ был правильным в середине 2012 года. Теперь (сентябрь 2014 года) документация гласит:
По умолчанию {{action}}
Помощник запускает метод на контроллере шаблона. [...] Если контроллер не реализует метод с тем же именем, что и действие, в своем объекте действий, действие будет отправлено маршрутизатору, где текущему активному конечному маршруту будет предоставлена возможность обработать действие. [...] Если ни контроллер шаблона, ни текущий активный маршрут не реализуют обработчик, действие будет продолжать переходить к любым родительским маршрутам. В конечном итоге, если ApplicationRoute
определено, у него будет возможность справиться с действием. Когда действие инициируется, но на контроллере, текущем маршруте или любом из предков текущего маршрута не реализован соответствующий обработчик действия, выдается ошибка.
Вы можете явно указать целевой атрибут, как отмечает @Stéphane, чтобы отправить действие в другое место.
Если не указано, целью помощника действий является controller.target. Как вы заметили, это обычно устанавливается на маршрутизаторе.
Если у вас есть шаблон, в котором вы хотите, чтобы цель по умолчанию отличалась, вы можете сделать это, установив свойство target контроллера. Например, чтобы установить цель для самого контроллера:
App.MyController = Ember.Controller.extend({
init: function(){
this._super();
this.set('target', this);
};
});
Контроллер не должен быть "непосредственно" ответственным за событие действия. Состояние / маршрут есть.
Я верю, что https://github.com/emberjs/ember.js/issues/1015 поможет вам.