Como devo compartilhar dados entre os componentes do Ember?

Meu aplicativo Ember possui uma rota que contém 2 componentes diferentes e um controlador com um modelo index.hbs.

Aqui está o que parece:

1) Um usuário pode selecionar vários filtros nas listas suspensas do Componente de filtro

2) O DataGrid é um componente separado do filtro

3) Um usuário pode selecionar várias linhas do DataGrid marcando as caixas

4) O botão Criar Relatório Personalizado aciona "sendAction" no controlador da rota

Esses dados não são específicos do modelo ... são apenas dados temporários necessários para que eu possa criar um relatório personalizado.

As melhores práticas do Ember são "Data Down / Actions Up" e, pelo que li, você não deve tentar acessar um componente de um controlador.

O problema, porém, é queo método createCustomReport no controlador precisa ter acesso a todos os filtros que foram selecionados no componente de filtro, juntamente com todas as linhas que foram verificadas no componente de grade.

Meu primeiro instinto é definir as propriedades no próprio componente - manter seu próprio estado - e obter uma referência ao componente do controlador para obter seu estado antes de passar para a função de relatório.

Mas, aparentemente, isso é um não-não.

Aqui está minha solução atual:

Cada vez que seleciono um filtro, há um sendAction que borbulha para o controlador a partir do componente e define uma propriedade personalizada no controlador.

Além disso, toda vez que eu seleciono uma caixa de seleção na grade, outro sendAction vai para o componente, então borbulha para o controlador e define uma propriedade personalizada no controlador para as linhas de grade selecionadas.

Então, quando clico em "createCustomReport", o método que é acionado no controlador tem acesso às propriedades que defini anteriormente - porque agora estão todos no controlador.

Portanto, é algo parecido com isto:

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...


    }
});

Aqui está o meu problema com isso

Não estou acessando diretamente os componentes do controlador, mas usando o princípio "Actions Up", estou configurando propriedades no controlador que são específicas da exibição.

Vindo de um background do Sencha ExtJS em que os controladores têm referências a seus pontos de vista, acho isso muito estranho.

Por não obter referências a componentes, eu deveria estar dissociando meu controlador de suas visualizações ... mas como todas as propriedades que estou configurando normalmente estariam na visualização, o controlador acaba sendoainda mais acoplado do ponto de vista do que seria se eu fosse apenas obter uma referência ao componente.

Isso é considerado "prática recomendada" no Ember ou existe uma maneira melhor de obter os dados de todos esses componentes separados para disparar o método createCustomReport?

questionAnswers(1)

yourAnswerToTheQuestion