props name emberjs ember component classnamebindings bubbling ember.js

ember.js - name - ember onclick



¿Cómo llamar una acción en una ruta usando acciones de cierre? (5)

Tengo la acción openModal definida en la ruta de la aplicación. Intento llamar a esta acción desde dentro de un componente.

Si utilizo la sintaxis para la acción de burbujeo:

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

entonces todo funciona como se espera y puedo activar esta acción usando this.sendAction("openModal") .

Sin embargo, no estoy seguro de cómo obtener el mismo resultado utilizando la nueva sintaxis de cierre:

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

En este caso, Ember se queja de que no hay acción openModal definida en el controlador. ¿Tengo que definir esta acción en cada controlador que usa my-component ? ¿Hay alguna manera de usar de alguna manera target opción de target para decirle a Ember que esta acción está definida en una ruta? ¿Está bien mezclar la sintaxis de burbujeo y cierre en un solo componente?

Estoy usando Ember 2.0 beta 1.


Puede enviar acciones de cierre a la ruta proxysándolos a través del controlador. Esto funciona con cualquier versión de Ember que admita acciones de cierre. La única advertencia es que el nombre de la acción debe diferir del controlador y la ruta.

Por ejemplo, dada esta plantilla:

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

Necesitarías una acción foo en tu controlador, que podría proxy a la ruta:

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

Luego en la ruta

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


Hasta que los componentes enrutables se introduzcan en algún lugar de Ember 2.1 o 2.2 o 2.3 o 2.4 o 2.5 o 2.6 o 2.7, es imposible pasar una acción de cierre desde una ruta.

Por ahora, solo puede pasar acciones de cierre desde un controlador a componentes secundarios.

UPD: Miko Paderes insinúa que hay un complemento disponible: https://github.com/dockyard/ember-route-action-helper


También es posible evitar crear un controlador, o si ya hay uno que evita agregar más lógica en él, especificando la propiedad de destino

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

en ruta o en camino

js

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

en plantilla

HBS

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


Prueba esto:

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

... que hace uso del método de envío en el controlador.

No puedo decir que lo entiendo completamente, dado que el segundo argumento para send es el context pero todavía está pasando argumentos adicionales a mi acción en la ruta correctamente. Actualmente estoy usando la versión 2.4.5 .


Pruebe el complemento Ember llamado ember-route-action-helper,

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

Puede reemplazar route-action con action en el momento en que estén disponibles los "componentes enrutables".

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

Entonces, el código anterior tiene un efecto similar al

Dentro de la ruta,

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

Dentro de HBS,

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