detectChange?
ведь setTimeout отработал до того, как выставился флаг markForCheck. Почему ангуляр всё равно на него реагирует?
https://stackblitz.com/edit/stackblitz-starters-b5lzwv?description=An%20angular-cli%20project%20based%20on%20@angular/animations,%20@angular/common,%20@angular/compiler,%20@angular/core,%20@angular/forms,%20@angular/platform-browser,%20@angular/platform-browser-dynamic,%20@angular/router,%20core-js,%20rxjs,%20tslib%20and%20zone.js&file=src%2Fmain.ts&title=Angular%20Starter
Так вы в сет тайм-ауте делаете то, что дёргает компонент Если там будет не работа с cd, то компонент не увидит
нет, в setTimeout я говорю, что нужно запустить проверку в следующей итерации. но следующей итерации не существует. т.е. я ожидаю, что проверки не будет, акомпонент просто останется помеченным для проверки.
Почему проверки не будет?
код внутри settimeout будет выполнен ДО cd
вот этот момент я не улавливаю. как такое может быть?
если cd тут вызывает только само событие setTimeout
просто как факт примите, внутренности зоны вам знать не нужно сначала handler потом cd
ок, приму что если при onPush написать что то вроде setTimeout(() => this.cdr.detectChanges();, то detectChanges вызовится дважды
но вообще без онпуша тоже дважды
А можете рассказать о кейсах странных? Я довольно сложные плееры нагородил, с временем и таймерами точными, и вроде не было нюансов с cd Какого рода задачи вас на такие изучения толкают? Просто понимать спектр задач хочу
лучше бы вообще зону выпилить - это да)))
ну зона то уйдёт, главное народу сказать что халява с текущим дефолтом больше не будет то что щас делается через rxjs + async pipe + onpush, то +- будет выглядеть также через сигналы но уже как ДЕФОЛТ новый
cd вызывает фреймворк, после отработки всех хэндлеров. setTimeout и т.п. формируют пул тасок. Они при выполнении что-то делают, состояние меняют. Когда все выполнились и пул пустой, пришло время проверить что поменялось в приложении и отрисовать.
Обсуждают сегодня