Как получить доступ к контроллеру с маршрута в Ember?

Есть ли надежный способ получить доступ к контроллеру с маршрута?

<a href="#" class="btn" {{action "someAction" user}}>add</a>

App.ApplicationRoute = Ember.Route.extend
  events:
    someAction: (user) ->
      console.log 'give me name from currentUser controller'

SomeAction является очень общим, и я думаю, что ApplicationRoute — лучшее место для него.


person wryrych    schedule 09.04.2013    source источник


Ответы (2)


Я думаю, что метод controllerFor должен быть доступен в этом событии:

App.ApplicationRoute = Ember.Route.extend
  events:
    someAction: (user) ->
      console.log this.controllerFor("currentUser").get("name")

Обновление в ответ на вопросы в комментариях:

Все зависит от того, что вы хотите сделать. Беспокоиться о DRY на таком базовом методе не имеет особого смысла, имхо.

В вашем случае kudos left я бы сделал это:

App.ApplicationRoute = Ember.Route.extend
  events:
    someAction: (user) ->
      this.controllerFor("currentUser").decrementKudos();
      // implement the decrementKudos in your controller

Но я думаю, что сохранение этого одного контроллера также должно работать, если для вас это слишком много кода:

App.ApplicationRoute = Ember.Route.extend
  currentUserCon : this.controllerFor("currentUser")
  events:
    someAction: (user) ->
      this.currentUserCon.decrementKudos();
      // implement the decrementKudos in your controller
person mavilein    schedule 09.04.2013
comment
Спасибо, но можно ли получить ссылку на это свойство, например, могу ли я сохранить его в переменной, чтобы я мог с ним работать? name = this.controllerFor('currentUser').get 'name' return "hello, #{name} это возможно? Многократный доступ к контроллерам не является СУХИМ :) - person wryrych; 10.04.2013
comment
Например, это было бы излишеством: this.controllerFor('currentUser').set 'kudosLeft', this.controllerFor('currentUser').get 'kudosLeft' - 1 :) - person wryrych; 10.04.2013
comment
@WojtekRyrych Также это: emberjs.com/guides/cookbook/working_with_objects/ - person Sam Selikoff; 20.04.2014
comment
Я не уверен, когда это произошло, но в Ember 1.12.0 controllerFor устарело. - person blong; 10.06.2015
comment
Вы можете внедрить его с помощью Ember.inject.controller() или из маршрута, где есть свойство this.controller для использования, - person Epirocks; 21.03.2019

В более новой версии ember вы можете получить доступ к контроллеру текущего маршрута в маршруте, как показано ниже.

Ember версии 2.5

currentUserCon : this.controller

если вы хотите получить доступ к другому контроллеру маршрутов, используйте метод controllerFor.

this.controllerFor('path to controller'); //put path to controller as parameter.
person murli2308    schedule 19.05.2016
comment
Я обнаружил (по крайней мере, в моем приложении Ember 2.14), что this.controller является undefined по крайней мере через хук маршрута activate(), но controllerFor('current.route.name') вернет контроллер. - person Tom Wayson; 06.09.2017
comment
Как и @TomWayson, я обнаружил, что это не работает в Ember 2.13. Документ предполагает, что он есть, но если вы попытаетесь его использовать, произойдет сбой. . Я смог успешно использовать this.controllerFor. - person glaucon; 13.03.2018