Подтвердить что ты не робот

Как вызвать действие на маршруте с использованием действий закрытия?

У меня есть действие openModal, определенное на маршруте приложения. Я пытаюсь вызвать это действие изнутри компонента.

Если я использую синтаксис для барботирования действий:

{{my-component openModal="openModal"}}

тогда все работает так, как ожидалось, и я могу запустить это действие с помощью this.sendAction("openModal").

Однако я не уверен, как получить тот же результат, используя новый синтаксис закрытия:

{{my-component openModal=(action "openModal")}}

В этом случае Ember жалуется, что на контроллере не определено действие openModal. Должен ли я определять это действие на каждом контроллере, который использует my-component? Есть ли способ каким-то образом использовать параметр target, чтобы сообщить Ember, что это действие определено на маршруте? Можно ли смешивать синтаксис барботирования и закрытия в одном компоненте?

Я использую Ember 2.0 beta 1.

4b9b3361

Ответ 1

До тех пор, пока маршрутизируемые компоненты не будут внедрены где-нибудь в Ember 2.1 или 2.2 или 2.3 или 2.4 или 2.5 или 2.6 или 2.7, невозможно передать действие закрытия из маршрута.

Теперь вы можете только пропускать действия закрытия с контроллера и на дочерние компоненты.

UPD: Miko Paderes намекает, что аддон доступен: https://github.com/dockyard/ember-route-action-helper

Ответ 2

Вы можете отправить действия закрытия на маршрут, проксимизируя их через контроллер. Это работает с любой версией Ember, которая поддерживает операции закрытия. Единственное предостережение в том, что имя действия должно отличаться от контроллера и маршрута.

Например, данный шаблон:

{{foo-component myAction=(action 'foo')}}

Вам понадобится действие foo на вашем контроллере, которое может проксировать маршрут:

proxyFooTo: 'fooBar',
actions: {

  foo(context) {
    this.send('proxyFooTo', context);
  }

}

Затем на маршруте

actions: {
  fooBar(context) {  ... handle fooBar ... } 
}

Ответ 3

Попробуйте следующее:

{{my-component openModal=(action send "openModal")}}

..., который использует метод send на контроллере.

Я не могу сказать, что я полностью понимаю это, учитывая, что второй аргумент send - это context, но он по-прежнему передает дополнительные аргументы моим действиям на маршруте правильно. В настоящее время я использую версию 2.4.5.

Ответ 4

Также можно избежать создания контроллера, или если в нем уже нет необходимости добавлять в него больше логики, указав свойство target

http://emberjs.jsbin.com/fiwokenoyu/1/edit?html,js,output

в пути

JS

setupController(controller,model){
  this._super(...arguments);
  controller.set('theRoute', this);
},
actions:{
  openModal(data){
    /*...*/
  }
}

в шаблоне

HBS

{{my-component openModalAction=(action 'openModal' target=theRoute)}}

Ответ 5

Попробуйте добавить Ember add-on под названием ember-route-action-helper,

https://github.com/dockyard/ember-route-action-helper

Вы можете просто заменить route-action на action в то время, когда становятся доступными "маршрутизируемые компоненты".

{{todo-list todos=model addTodo=(route-action "addTodo")}}

Таким образом, приведенный выше код имеет аналогичный эффект:

Внутри маршрута

setupController(controller,model){
  this._super(...arguments);
  controller.set('theRoute', this);
},
actions:{
  addTodo(data){
    /*...*/
  }
}

Внутри HBS,

{{todo-list addTodo=(action 'addTodo' target=theRoute)}}