2012-06-15 6 views
5

Когда я использую Ember Router, как я могу определить действия в шаблоне, которые подключены к контроллеру?Ember.js Router Action to Controller

Пример здесь: http://jsfiddle.net/KvJ38/3/

Унтер Мой профиль два действия: Один определен на государстве, и работает Два определяется на контроллере. Как я могу это сделать, или я должен использовать другой подход?

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"); 
    }, 
    }) 
}); 

ответ

12

цель по умолчанию действия является маршрутизатором, но вы можете определить другой в шаблоне:

{{action two target="controller"}} 

И добавить функцию «два» в «App.ProfileController».

UPDATE

Этот ответ был правильным, мы надеемся, в середине 2012 года В настоящее время (сентябрь 2014), говорится в документации:

По умолчанию {{action}} помощник запускает метод на контроллере шаблона. [...] Если контроллер не реализует метод с тем же именем, что и действие в его объекте действий, действие будет отправлено маршрутизатору, где текущему активному листовому маршруту будет предоставлена ​​возможность обработать действие , [...] Если ни контроллер шаблона, ни текущий активный маршрут не реализуют обработчик, действие будет продолжать появляться на любых родительских маршрутах. В конечном счете, если определено значение ApplicationRoute, у него будет возможность обработать действие. Когда действие инициируется, но на контроллере не выполняется соответствующий обработчик действий, текущий маршрут или любой из предков текущего маршрута, будет выведена ошибка.

+1

Спасибо. Вот рабочее решение: http://jsfiddle.net/KvJ38/4/ – Lux

+1

На самом деле, цель по умолчанию для действия - это содержащий контроллер, а затем маршрутизатор. Вот пример jsbin, показывающий, что контроллер обрабатывает действие, когда оно определено как на контроллере, так и на маршруте: http://emberjs.jsbin.com/tupil/3/edit. И вот ember docs о действиях: http://emberjs.com/guides/templates/actions/ – bantic

+0

Из документов: «По умолчанию помощник {{action}} запускает метод на контроллере шаблона« http://emberjs.com/guides/templates/actions/#toc_action-bubbling – fmendez

0

Контроллер не должен «непосредственно» отвечать за действие. Состояние/маршрут.

Я считаю, https://github.com/emberjs/ember.js/issues/1015 поможет вам.

+0

Спасибо. Эта ссылка полезна! Но, что насчет просмотра? Почему не отображается цель по умолчанию? http://jsfiddle.net/KvJ38/9/ – Lux

4

Вы можете указать атрибут цели явно, как указано @ Stéphane, чтобы отправить действие в другое место.

Если не указано, целью вспомогательного элемента действия является control.target. Как вы отметили, это обычно устанавливается на маршрутизатор.

Если у вас есть шаблон, в котором вы хотите, чтобы цель по умолчанию была другой, вы можете сделать это, установив целевое свойство контроллера. Например, чтобы установить цель на сам контроллер:

App.MyController = Ember.Controller.extend({ 
    init: function(){ 
    this._super(); 
    this.set('target', this); 
    }; 
}); 
+0

Также для барботажа для обработки действий, в то время как последовательность говорит ... текущий контроллер, затем текущий маршрут, а затем другие активные маршруты ... означает ли это, что для родителя, только Маршруты получают возможность обрабатывать (а не контроллеры. родительские контроллеры)? – testndtv