Да, вы можете установить входы компонентов, отображаемых через выходы маршрутизатора . К сожалению, вы должны делать это программно, как упоминалось в других ответах. Есть большая оговорка, когда задействованы наблюдаемые (описанные ниже).
Вот как:
(1) Подключитесь к activate
событию роутера-розетки в родительском шаблоне:
<router-outlet (activate)="onOutletLoaded($event)"></router-outlet>
(2) Переключитесь на родительский файл машинописного текста и программно установите входные данные дочернего компонента каждый раз, когда они активируются:
onOutletLoaded(component) {
component.node = 'someValue';
}
Выполнено.
Однако приведенная выше версия onOutletLoaded
упрощена для ясности. Это работает только в том случае, если вы можете гарантировать, что все дочерние компоненты имеют точно такие же входы, которые вы назначаете. Если у вас есть компоненты с разными входами, используйте защиты типов:
onChildLoaded(component: MyComponent1 | MyComponent2) {
if (component instanceof MyComponent1) {
component.someInput = 123;
} else if (component instanceof MyComponent2) {
component.anotherInput = 456;
}
}
Почему этот метод может быть предпочтительнее метода обслуживания?
Ни этот метод, ни метод службы не являются «правильным способом» взаимодействия с дочерними компонентами (оба метода отходят от чистой привязки к шаблону), поэтому вам просто нужно решить, какой способ больше подходит для проекта.
Этот метод, однако, позволяет избежать тесной связи, связанной с подходом «создать сервис для связи» (т. Е. Родитель нуждается в сервисе, а все потомки нуждаются в сервисе, что делает потомков непригодными для использования где-либо еще). Обычно предпочтение отдается развязке.
Во многих случаях этот метод также кажется более близким к «угловому способу», потому что вы можете продолжать передавать данные своим дочерним компонентам через @Inputs (это часть разделения - это позволяет повторно использовать в другом месте). Это также хорошо подходит для уже существующих или сторонних компонентов, которые вы не хотите или не можете тесно связать с вашим сервисом.
С другой стороны, это может показаться менее угловатым, когда ...
Предостережение
Предостережение с этим методом заключается в том, что, поскольку вы передаете данные в файл машинописного текста, у вас больше нет возможности использовать паттерн конвейерной асинхронности, используемый в шаблонах (например {{ myObservable$ | async }}
) для автоматического использования и передачи наблюдаемых данных дочерним компонентам.
Вместо этого вам нужно настроить что-то, чтобы получать текущие наблюдаемые значения при каждом onChildLoaded
вызове функции. Скорее всего, это также потребует некоторого разрушения функции родительского компонента onDestroy
. В этом нет ничего необычного, часто бывают случаи, когда это необходимо сделать, например, при использовании наблюдаемого, который даже не попадает в шаблон.
node
где это как тип,string
но похоже, что это не работает, или я делаю что-то не так