Демо Stackblitz
Первый цикл обнаружения изменений происходит после OnInit
. В этом случае angular запускает обнаружение изменений для обновления модели и вида. Затем он снова запускается в NgAfterViewInit и не ожидает каких-либо изменений в вашем шаблоне. Что меняется, так это ширина в вашем TableComponent
. Вы можете избежать этого, если вам удастся отложить выполнение выражения, изменяющего ширину. Один из способов сделать это, который пришел ко мне, - использовать канал, который возвращает наблюдаемое, которое может задерживать выброс ширины для изменения свойства:
<div class="cell" [style.width.px]="column | offsetWidth | async">-</div>
Канал offsetWidth
будет выглядеть следующим образом:
transform(column: ColumnComponent): Observable<string> {
return of(1).pipe(
delay(0), // <= this will delay the emision
switchMap(_ =>
of(column && column.elementRef.nativeElement.offsetWidth))
);
}