Angular: ExpressionChangedAfterItHasBeenCheckedError, когда данные получены с внутреннего сервера без обновления представления

Пожалуйста, потерпите меня, если вы найдете этот вопрос довольно простым, поскольку я новичок в Angular, а также во внешнем программировании и javascript. У меня есть три угловых компонента A, B и C. Шаблон C содержится в шаблоне B и шаблоне B, содержащемся в A. A передает пользовательские данные в B через параметры @Input. Используя введенную информацию, компонент B выполняет вызов API-интерфейса rest, выходные данные которого передаются компоненту C с использованием параметра C @Input. Ожидается, что компонент C отобразит данные.

Если я жестко закодирую отображаемые данные в ngInit () B, я не сомневаюсь в отображении данных в компоненте C. Однако, если я вызываю restAPI, чтобы предоставить данные сервера, я получаю ExpressionChangedAfterItHasBeenCheckedError. Я внимательно посмотрел и понял, что эта ошибка возникает в среде разработки и связана с обнаружением изменений.

Помимо этой ошибки, несмотря на то, что я получаю выходные данные api, мои данные отображения не меняются, даже если остальные выходные данные изменились. Я пробовал использовать ChangeDetectionStrategy.onPush (), changeDetectionRef.detectChanges () и т.д., но не дал положительного результата.

Rest API возвращает ответ, который извлекается в .then (). Ниже приведен остальной вызов API:

return this.http.request(url, options).toPromise()
        .then((response: any) => this.extractData(response))
        .catch((error: any) => this.handleError(error));

Поможет ли блокирующий синхронный вместо асинхронного вызова остальных API?

Не уверен, что мне нужно сделать, чтобы решить эту проблему. Благодарим вас за помощь.

Можете ли вы создать простой проект StackBlitz, чтобы воспроизвести эту проблему? StackBlitz.com

SiddAjmera 21.08.2018 20:56

Привет, Сиддхарт, спасибо за ответ. Как вы предложили, я создал образец проекта, чтобы воспроизвести сценарий аналогично среде разработки. Однако на stackblitz это сработало. Однако я не работаю в моей среде разработки. Я использую компилятор Typescript @ 2.3.4. Может ли это быть проблемой?

alevi.dcosta 22.08.2018 17:04

Есть ли отличия в версиях Angular? StackBlitz использует Angular 6, и даже я видел, как он работает на Angular 6. Но в Angular 5 или ранее мы действительно меняем выражение после того, как оно было проверено на ошибку.

SiddAjmera 22.08.2018 17:45

Спасибо, Сиддхарт. По этой причине я перехожу с Angular 2 на Angular 6. Однако сталкиваюсь с трудностями при миграции. Отвечу, как только я заработаю на Angular 6 или столкнусь с той же проблемой

alevi.dcosta 23.08.2018 09:59

Привет, Сиддхарт, я обновил angular до 6.0, и данные появились без каких-либо усилий. Однако ошибка появляется в режиме разработки, что меня устраивает. Похоже, что тогда Angular 2.2 не так хорошо справлялся с управлением изменениями. Я почему-то не понимаю, как такая основная функциональность может быть настолько нарушена и неправильно утверждена как работающая Google.

alevi.dcosta 29.08.2018 19:07
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
76
1

Ответы 1

После обновления с Angular 2.2 до 6.0 функция синхронизации изменений работала должным образом. то есть, когда данные поступают с сервера, они отображаются в пользовательском интерфейсе. Ошибка продолжается в режиме разработки.

Другие вопросы по теме