Первоначальное центрирование содержимого осуществляется с помощью эффекта в конструкторе:
Код: Выделить всё
element = viewChild.required('myWindow');
#scrollTo = computed(() => {
const nativeElement = this.element().nativeElement;
const scrollHeight: number = nativeElement.scrollHeight;
const offsetHeight: number = nativeElement.offsetHeight;
return 4 + (scrollHeight - offsetHeight) / 2;
});
constructor() {
effect(() =>
this.element().nativeElement.scrollTo(0, this.#scrollTo())
);
}
Как вы могли догадаться, жесткое программирование значения прокрутки не решает проблему (и это также не является жизнеспособным решением).
Я предполагаю, что это гонка -условие между макетом браузера (в моем случае Chrome) расчет и расчет сигнала ScrollTo? Есть идеи, как исправить это вычисление и/или поведение без задержки в конструкторе компонента?
Вот StackBlitz, демонстрирующий проблему; вы можете изменить конструктор компонента окна, чтобы увидеть различные рабочие/неработающие комбинации.
ОБНОВЛЕНИЯ
Я подал Отчет об ошибках Angular, поскольку это проблема фреймворка; обходной путь необходим до тех пор, пока не будет доступно исправление Angular.
Как заметил Матье Риглер, правильным эффектом для взаимодействия с DOM является renderAfterEffect ; к сожалению, на данный момент это также не удается без тайм-аута или отключения горячей замены модуля (HMR):
Код: Выделить всё
constructor() {
renderAfterEffect(() =>
setTimeout(() =>
this.element().nativeElement.scrollTo(0, this.#scrollTo()),
200
)
);
}
Код: Выделить всё
constructor() {
effect(() =>
setTimeout(() =>
this.element().nativeElement.scrollTo(0, this.#scrollTo()),
200
)
);
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... out-quirks
Мобильная версия