Tak, możesz ustawić wejścia komponentów wyświetlanych przez gniazda routera . Niestety, musisz to zrobić programowo, jak wspomniano w innych odpowiedziach. Jest to duże zastrzeżenie, gdy w grę wchodzą obserwowalne (opisane poniżej).
Oto jak:
(1) Podłącz do activate
zdarzenia gniazda routera w szablonie nadrzędnym:
<router-outlet (activate)="onOutletLoaded($event)"></router-outlet>
(2) Przełącz się do pliku maszynopisu rodzica i ustaw programowo dane wejściowe komponentu podrzędnego za każdym razem, gdy są aktywowane:
onOutletLoaded(component) {
component.node = 'someValue';
}
Gotowe.
Jednak powyższa wersja onOutletLoaded
jest uproszczona dla przejrzystości. Działa tylko wtedy, gdy możesz zagwarantować, że wszystkie komponenty podrzędne mają dokładnie te same dane wejściowe, które przypisujesz. Jeśli masz komponenty z różnymi danymi wejściowymi, użyj osłon typów:
onChildLoaded(component: MyComponent1 | MyComponent2) {
if (component instanceof MyComponent1) {
component.someInput = 123;
} else if (component instanceof MyComponent2) {
component.anotherInput = 456;
}
}
Dlaczego ta metoda może być preferowana w stosunku do metody serwisowej?
Ani ta metoda, ani metoda usługi nie są „właściwą drogą” do komunikacji z komponentami potomnymi (obie metody odchodzą od czystego wiązania szablonu), więc musisz tylko zdecydować, który sposób jest bardziej odpowiedni dla projektu.
Jednak ta metoda pozwala uniknąć ścisłego powiązania związanego z podejściem „stwórz usługę dla komunikacji” (tj. Rodzic potrzebuje usługi, a wszystkie dzieci potrzebują usługi, co sprawia, że dzieci nie nadają się do użytku gdzie indziej). Zwykle preferowane jest odsprzęganie.
W wielu przypadkach ta metoda wydaje się również bliższa „drodze kątowej”, ponieważ możesz kontynuować przekazywanie danych do komponentów podrzędnych przez @Inputs (to jest część odsprzęgająca - umożliwia to ponowne wykorzystanie w innym miejscu). Jest to również dobre rozwiązanie dla już istniejących lub komponentów innych firm, których nie chcesz lub nie możesz ściśle połączyć z twoją usługą.
Z drugiej strony może wydawać się mniej kątowy, gdy ...
Caveat
Ograniczeniem związanym z tą metodą jest to, że ponieważ przekazujesz dane w pliku maszynopisu, nie masz już możliwości używania wzorca potoku asynchronicznego używanego w szablonach (np. {{ myObservable$ | async }}
) Do automagicznego używania i przekazywania obserwowalnych danych do komponentów potomnych.
Zamiast tego musisz skonfigurować coś, aby uzyskać bieżące obserwowalne wartości za każdym razem, gdy onChildLoaded
wywoływana jest funkcja. Prawdopodobnie będzie to również wymagało porzucenia funkcji komponentu nadrzędnego onDestroy
. Nie jest to nic niezwykłego, często zdarzają się przypadki, w których trzeba to zrobić, na przykład gdy używasz obserwowalnego, który nawet nie dociera do szablonu.
node
gdzie jest jako typ,string
i wydaje się, że nie działa lub robię coś źle