Для чего используются Content hooks (ContentInit, ContentChecked) в Angular
Что проверяют
Различаете ли вы контент компонента и его собственное представление и знаете ли, в какой момент Angular заполняет запросы @ContentChild. Точные имена хуков: ngAfterContentInit и ngAfterContentChecked, интерфейсы AfterContentInit и AfterContentChecked. Следом спрашивают, чем они отличаются от AfterView-хуков и почему ngAfterContentChecked опасен для производительности.
Как отвечать
Контент это разметка, которую родитель положил между тегами компонента и которая попадает в шаблон через <ng-content>. Представление это собственный шаблон компонента. Для контента есть два хука:
ngAfterContentInit: вызывается один раз, после первогоngDoCheck, когда спроецированный контент проинициализирован. Здесь уже доступны@ContentChildи@ContentChildren, поэтому это место для логики, зависящей от переданных детей: например, компонент вкладок находит всеTabComponentи активирует первую;ngAfterContentChecked: вызывается после каждой проверки контента при обнаружении изменений, то есть очень часто. Годится только для лёгких действий.
Назовите порядок: ngOnChanges, ngOnInit, ngDoCheck, затем оба content-хука, затем ngAfterViewInit и ngAfterViewChecked. Content-хуки идут до проверки собственного шаблона, поэтому в них ещё можно менять поля, привязанные к шаблону компонента, без ошибки ExpressionChangedAfterItHasBeenCheckedError.
Если набор детей меняется динамически (через *ngFor или @for), подписываются на QueryList.changes. В свежих версиях Angular есть сигнальные запросы contentChild() и contentChildren(): значение приходит сигналом, и часть кода из хуков переезжает в computed() или effect().
Где спотыкаются
Обращаются к @ContentChild в ngOnInit и получают undefined. Без static: true запрос заполняется только к ngAfterContentInit.
Путают @ContentChild и @ViewChild: ищут элемент своего шаблона content-запросом и не находят его.
Кладут тяжёлую работу в ngAfterContentChecked. С Zone.js проверка изменений запускается на любой клик, таймер и HTTP-ответ, и этот хук будет вызываться постоянно.