Действие 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 поможет вам.

Другие вопросы по тегам