Я пытаюсь построить это:
┌--------------------------------------------┐
| -Page 1- -Page 2- -Page 3- |
├----------┬---------------------------------┤
| Link 1 | <router-outlet></router-outlet> |
| Link 2 | |
| Link 3 | |
| | |
| | |
Список ссылок слева зависит от страницы.
Типичная страница выглядит следующим образом:
<div>
<app-component-1 appAnchor anchorTitle="Link 1"></app-component-1>
<app-component-2 appAnchor anchorTitle="Link 2"></app-component-2>
<app-component-3 appAnchor anchorTitle="Link 3"></app-component-3>
</div>
Есть несколько директив appAnchor
, связанных с @Input() anchorTitle: string
.Я хочу автоматически захватить их и обновить левое меню.
Проблема возникает, когда я пытаюсь запросить эти элементы через router-outlet
.
Итак, я попытался:
@ViewChildren(AnchorDirective)
viewChildren: QueryList<AnchorDirective>;
@ContentChildren(AnchorDirective)
contentChildren: QueryList<AnchorDirective>;
ngAfterContentInit(): void {
console.log(`AppComponent[l.81] contentChildren`, this.contentChildren);
}
ngAfterViewInit(): void {
console.log(`AppComponent[l.85] viewChildren`, this.viewChildren);
}
но я всегда получаю пустое QueryList
:
QueryList {dirty: false, _results: Array (0), изменения: EventEmitter, длина: 0, последняя: не определено,…}
Я также попытался:
@ContentChildren(AnchorDirective, {descendants: true})
@ContentChildren(AnchorDirective, {descendants: false})
Наконец, я попытался в последний момент запросить элементы с помощью:
<router-outlet (activate)="foo()"></router-outlet>
Примечание: я нехотите, чтобы дочерний компонент отправлял данные в родительский компонент через службу, потому что это вызывает некоторые ExpressionChangedAfterItHasBeenCheckedError
, а считается плохой практикой .Я действительно предпочел бы запрашивать ссылки непосредственно из родительского компонента.
РЕДАКТИРОВАТЬ: Вот stackBlitz , показывающий проблему.Если внутри компонента используется @ViewChildren
, все работает.Но если @ViewChildren
используется из корневого компонента, он завершается ошибкой.