Sí, puede configurar las entradas de los componentes que se muestran a través de las salidas del enrutador . Lamentablemente, debe hacerlo mediante programación, como se menciona en otras respuestas. Hay una gran advertencia sobre eso cuando se trata de observables (que se describen a continuación).
Así es cómo:
(1) Conéctese al activate
evento del router-outlet en la plantilla principal:
<router-outlet (activate)="onOutletLoaded($event)"></router-outlet>
(2) Cambie al archivo de texto mecanografiado del padre y configure las entradas del componente secundario mediante programación cada vez que se activen:
onOutletLoaded(component) {
component.node = 'someValue';
}
La versión anterior de onOutletLoaded
está simplificada para mayor claridad, pero solo funciona si puede garantizar que todos los componentes secundarios tengan exactamente las mismas entradas que está asignando. Si tiene componentes con diferentes entradas, use protectores de tipo:
onChildLoaded(component: MyComponent1 | MyComponent2) {
if (component instanceof MyComponent1) {
component.someInput = 123;
} else if (component instanceof MyComponent2) {
component.anotherInput = 456;
}
}
¿Por qué se puede preferir este método al método de servicio?
Ni este método ni el método de servicio son "la forma correcta" de comunicarse con los componentes secundarios (ambos métodos se alejan del enlace de plantilla puro), por lo que solo tiene que decidir qué forma se siente más apropiada para el proyecto.
Sin embargo, este método le permite evitar crear el objeto intermediario (el servicio), que combina estrechamente los componentes de servicio y secundarios. En muchos casos, esto se parece más al "modo angular" porque puede continuar pasando datos a sus componentes secundarios a través de @Inputs. También es una buena opción para componentes ya existentes o de terceros que no desea o no puede acoplar estrechamente con ese servicio. Por otro lado, puede sentirse menos como la forma angular cuando ...
Consideración
La advertencia con este método es que, dado que está pasando datos de forma programática, ya no tiene la opción de pasar datos observables en su plantilla (¡sorpresa!). Eso significa que pierde la gran ventaja de administrar angularmente el ciclo de vida del observable cuando usa el patrón pipe-async.
En su lugar, deberá configurar algo para obtener los valores observables actuales cada vez onChildLoaded
que se llame a la función. Es probable que esto también requiera algún desmontaje en la onDestroy
función del componente principal . Esto no es nada inusual, hay otros casos en los que es necesario hacer esto, como cuando se usa un observable que ni siquiera llega a la plantilla.
node
donde es como un tipostring
y no parece funcionar o estoy haciendo algo mal