Sim, você pode definir entradas de componentes exibidos por meio de saídas do roteador . Infelizmente, você precisa fazer isso de forma programática, conforme mencionado em outras respostas. Há uma grande advertência quando os observáveis estão envolvidos (descrito abaixo).
Veja como:
(1) Conecte-se ao activate
evento da tomada do roteador no modelo pai:
<router-outlet (activate)="onOutletLoaded($event)"></router-outlet>
(2) Mude para o arquivo de texto digitado do pai e defina as entradas do componente filho programaticamente sempre que forem ativados:
onOutletLoaded(component) {
component.node = 'someValue';
}
A versão acima do onOutletLoaded
é simplificada para maior clareza, mas só funciona se você puder garantir que todos os componentes filhos tenham exatamente as mesmas entradas que você está atribuindo. Se você tiver componentes com entradas diferentes, use protetores de tipo:
onChildLoaded(component: MyComponent1 | MyComponent2) {
if (component instanceof MyComponent1) {
component.someInput = 123;
} else if (component instanceof MyComponent2) {
component.anotherInput = 456;
}
}
Por que esse método pode ser preferido ao método de serviço?
Nem esse método nem o método de serviço são "a maneira certa" de se comunicar com os componentes filhos (ambos os métodos se distanciam da associação de modelo pura), portanto, você só precisa decidir qual forma parece mais apropriada para o projeto.
Esse método, entretanto, permite que você evite fazer o objeto intermediário (o serviço), que une fortemente o serviço e os componentes filho. Em muitos casos, isso parece mais "angular" porque você pode continuar passando dados para seus componentes filhos por meio de @Inputs. Também é uma boa opção para componentes já existentes ou de terceiros que você não deseja ou não pode unir fortemente a esse serviço. Por outro lado, pode parecer menos angular quando ...
Embargo
A ressalva com este método é que, uma vez que você está passando dados programaticamente, você não tem mais a opção de passar dados observáveis em seu modelo (surpresa!). Isso significa que você perde a grande vantagem do gerenciamento angular do ciclo de vida do observável para você ao usar o padrão de pipe assíncrono.
Em vez disso, você precisará configurar algo para obter os valores observáveis atuais sempre que a onChildLoaded
função for chamada. Isso provavelmente também exigirá alguma desmontagem na onDestroy
função do componente pai . Isso não é nada incomum, há outros casos em que isso precisa ser feito, como ao usar um observável que nem chega ao modelo.
node
onde está como um tipostring
e não parece funcionar ou estou fazendo algo errado