¿Cómo debo compartir datos entre los componentes de Ember?

La aplicación My Ember tiene una ruta que contiene 2 componentes diferentes y un controlador con una plantilla index.hbs.

Así es como se ve:

1) Un usuario puede seleccionar múltiples filtros de los menús desplegables del Componente de filtro

2) DataGrid es un componente separado del filtro

3) Un usuario puede seleccionar varias filas de DataGrid marcando casillas

4) El botón Crear informe personalizado dispara "sendAction" al controlador de la ruta

Estos datos no son específicos del modelo ... son solo datos temporales que se requieren antes de que pueda hacer un informe personalizado.

Las mejores prácticas de Ember son "Data Down / Actions Up", y por lo que leí, no deberías intentar acceder a un componente desde un controlador.

Sin embargo, el problema es queEl método createCustomReport en el controlador debe tener acceso a todos los filtros que se seleccionaron en el componente de filtro junto con todas las filas que se verificaron en el componente de cuadrícula.

Mi primer instinto es establecer las propiedades en el componente en sí mismo, hacer que mantenga su propio estado, y luego obtener una referencia al componente del controlador para obtener su estado antes de pasarlo a la función de informe.

Pero aparentemente eso es un no-no.

Aquí está mi solución actual:

Cada vez que selecciono un filtro, hay una acción sendAction que aparece en el controlador desde el componente y establece una propiedad personalizada en el controlador.

Además, cada vez que selecciono una casilla de verificación de la cuadrícula, otro sendAction va al componente, luego aparece en el controlador y establece una propiedad personalizada en el controlador para las filas de la cuadrícula seleccionadas.

Luego, cuando hago clic en "createCustomReport", el método que se activa en el controlador tiene acceso a las propiedades que configuré anteriormente, porque ahora están todas en el controlador.

Entonces se parece a esto:

import Ember from 'ember';

export default Ember.Controller.extend({

    myFirstFilter: undefined,
    mySecondFilter: undefined,

    actions: {
        createCustomReport() {
            // do something with all those component properties you've been setting
        },

        // These are triggered by the sendAction on the respective component
        firstFilterMethod(myProperty1) {                
            this.set('myFirstFilter', myProperty1.name);
        },

        secondFilterMethod(myProperty2) {               
            this.set('mySecondFilter', myProperty2.name);
        },

        ... etc...


    }
});

Aquí está mi problema con esto

No estoy accediendo directamente a los componentes desde el controlador, pero al usar el principio "Actions Up", configuro propiedades en el controlador que son específicas de la vista.

Viniendo de un fondo Sencha ExtJS donde los controladores tienen referencias a sus puntos de vista, esto me parece muy extraño.

Al no obtener referencias a los componentes, se supone que debo desacoplar mi controlador de sus vistas ... pero como todas las propiedades que configuro normalmente estarían en la vista, el controlador termina siendoaún más acoplado a la vista de lo que sería si solo obtuviera una referencia al componente.

¿Se considera esta "práctica recomendada" en Ember o hay una mejor manera de obtener los datos de todos estos componentes separados para activar el método createCustomReport?

Respuestas a la pregunta(1)

Su respuesta a la pregunta