Пожалуйста, потерпите меня, если вы найдете этот вопрос довольно простым, поскольку я новичок в 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 это сработало. Однако я не работаю в моей среде разработки. Я использую компилятор Typescript @ 2.3.4. Может ли это быть проблемой?
Есть ли отличия в версиях Angular? StackBlitz использует Angular 6, и даже я видел, как он работает на Angular 6. Но в Angular 5 или ранее мы действительно меняем выражение после того, как оно было проверено на ошибку.
Спасибо, Сиддхарт. По этой причине я перехожу с Angular 2 на Angular 6. Однако сталкиваюсь с трудностями при миграции. Отвечу, как только я заработаю на Angular 6 или столкнусь с той же проблемой
Привет, Сиддхарт, я обновил angular до 6.0, и данные появились без каких-либо усилий. Однако ошибка появляется в режиме разработки, что меня устраивает. Похоже, что тогда Angular 2.2 не так хорошо справлялся с управлением изменениями. Я почему-то не понимаю, как такая основная функциональность может быть настолько нарушена и неправильно утверждена как работающая Google.





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