Sì, è possibile impostare gli ingressi dei componenti visualizzati tramite le prese del router . Purtroppo, devi farlo in modo programmatico, come menzionato in altre risposte. C'è un grande avvertimento a questo quando sono coinvolti gli osservabili (descritti di seguito).
Ecco come:
(1) Collegati activate
all'evento della presa del router nel modello principale:
<router-outlet (activate)="onOutletLoaded($event)"></router-outlet>
(2) Passa al file dattiloscritto del genitore e imposta gli input del componente figlio in modo programmatico ogni volta che vengono attivati:
onOutletLoaded(component) {
component.node = 'someValue';
}
La versione precedente di onOutletLoaded
è semplificata per chiarezza, ma funziona solo se è possibile garantire che tutti i componenti figlio abbiano esattamente gli stessi input che si stanno assegnando. Se si dispone di componenti con ingressi diversi, utilizzare protezioni di tipo:
onChildLoaded(component: MyComponent1 | MyComponent2) {
if (component instanceof MyComponent1) {
component.someInput = 123;
} else if (component instanceof MyComponent2) {
component.anotherInput = 456;
}
}
Perché questo metodo può essere preferito al metodo di servizio?
Né questo metodo né il metodo del servizio sono "il modo giusto" per comunicare con i componenti figli (entrambi i metodi si allontanano dal semplice binding di modelli), quindi devi solo decidere quale sia il modo più appropriato per il progetto.
Questo metodo, tuttavia, consente di evitare di creare l'oggetto intermediario (il servizio), che accoppia strettamente il servizio e le componenti figlio. In molti casi questo sembra più vicino alla "via angolare" perché puoi continuare a trasmettere dati ai tuoi componenti figlio tramite @Inputs. È anche adatto per componenti già esistenti o di terze parti che non vuoi o non puoi accoppiare strettamente con quel servizio. D'altra parte, potrebbe sembrare meno angolare quando ...
Avvertimento
L'avvertenza con questo metodo è che poiché stai passando i dati in modo programmatico, non hai più la possibilità di passare dati osservabili nel tuo modello (sorpresa!). Ciò significa che si perde l'enorme vantaggio della gestione angolare del ciclo di vita dell'osservabile quando si utilizza il modello pipe-async.
Invece, dovrai impostare qualcosa per ottenere i valori osservabili correnti ogni volta che onChildLoaded
viene chiamata la funzione. Ciò richiederà probabilmente anche un certo smontaggio nella onDestroy
funzione del componente genitore . Non è niente di troppo insolito, ci sono altri casi in cui è necessario farlo, come quando si utilizza un osservabile che non arriva nemmeno al modello.
node
cui è come un tipostring
e non sembra funzionare o sto facendo qualcosa di sbagliato