Как вызвать действие на маршруте с использованием действий закрытия?
У меня есть действие openModal
, определенное на маршруте приложения. Я пытаюсь вызвать это действие изнутри компонента.
Если я использую синтаксис для барботирования действий:
{{my-component openModal="openModal"}}
тогда все работает так, как ожидалось, и я могу запустить это действие с помощью this.sendAction("openModal")
.
Однако я не уверен, как получить тот же результат, используя новый синтаксис закрытия:
{{my-component openModal=(action "openModal")}}
В этом случае Ember жалуется, что на контроллере не определено действие openModal
. Должен ли я определять это действие на каждом контроллере, который использует my-component
? Есть ли способ каким-то образом использовать параметр target
, чтобы сообщить Ember, что это действие определено на маршруте? Можно ли смешивать синтаксис барботирования и закрытия в одном компоненте?
Я использую Ember 2.0 beta 1.
Ответы
Ответ 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)}}