В идеале вы должны вызывать источники данных внутри ловушки NgOnInit, чтобы предотвратить эту проблему. Способ решить эту проблему - сделать изменения значения загрузчика вне текущего цикла инициализации компонента с использованием оператора задержки RX JS:
isLoadingSubject = = new Subject<boolean>();
isLoading: Observable<boolean> = this.isLoadingSubject.pipe( delay(0) );
Я думаю, что это уместное чтение: https://blog.angular-university.io/angular-debugging/
Обновлено, чтобы немного распаковать во второй строке кода:
Angular обнаружение изменений функций - это процесс, который запускается:
- события ввода (щелчок, наведение курсора мыши, нажатие клавиши и т. Д. c.)
- Ajax запросы
- setTimeout () и setInterval ()
Затем он проходит через дерево компонентов приложения, проверяя все привязки данных (в соответствии со стратегией CD et c).
Вы видите ошибку, когда в одном цикле обнаружения изменений Angular обнаруживает, что значение привязки изменилось уже ПОСЛЕ того, как для этой привязки была проведена проверка изменений, что вызвало проблему для Angular, поскольку он не сможет обновить шаблон соответствующим образом.
Таким образом, чтобы исправить такую проблему, мы могли либо обеспечить изменение происходит до начала указанного c цикла CD (иногда мы можем добиться этого, переместив действие по изменению данных в другой обработчик жизненного цикла компонента) или отложив его - убедившись, что изменение будет выполнено в следующем цикле.
* Задержка 1026 * RX JS под капотом использует setTimeout (), который, как упоминалось выше, запускает другой собственный цикл CD. Subject - это Observable, который может многоадресно передавать нескольким Observers. Таким образом, мы перенаправляем его, чтобы включить «задержку», и, таким образом, мы резервируем цикл CD для этого c изменения.
Так что, если бы мы были педанти c - это скорее обходной путь, который работает. Но за счет другого цикла компакт-дисков, который мы здесь запускаем.