Angular:ExpressionChangedTerithasBeenCheckedError从后端服务器检索数据时,视图未更新

Angular:ExpressionChangedTerithasBeenCheckedError从后端服务器检索数据时,视图未更新,angular,parent-child,angular2-changedetection,Angular,Parent Child,Angular2 Changedetection,如果你觉得这个问题很基本,请耐心听我说,因为我对Angular、前端编程和javascript都是新手。我有三个角度分量A、B和C。C的模板包含在B中,B的模板包含在A中。A通过@Input params向B提供用户数据。组件B使用输入的信息进行RESTAPI调用,其rest输出通过C的@Input参数传递给组件C。组件C应显示数据 如果我在B的ngInit()中硬编码显示数据,我在组件C中显示数据时不会感到不安。但是,如果我调用restAPI以提供服务器数据,那么我会得到表达式ChangedT

如果你觉得这个问题很基本,请耐心听我说,因为我对Angular、前端编程和javascript都是新手。我有三个角度分量A、B和C。C的模板包含在B中,B的模板包含在A中。A通过@Input params向B提供用户数据。组件B使用输入的信息进行RESTAPI调用,其rest输出通过C的@Input参数传递给组件C。组件C应显示数据

如果我在B的ngInit()中硬编码显示数据,我在组件C中显示数据时不会感到不安。但是,如果我调用restAPI以提供服务器数据,那么我会得到表达式ChangedTerithasBeenCheckedError。 我查看了hi和lo,了解到此错误发生在开发环境中,并且与更改检测有关

除了这个错误,即使我收到了api输出,我的显示数据也不会改变,即使其余的输出数据已经改变了。我尝试过使用ChangeDetectionStrategy.onPush()、changeDetectionRef.detectChanges()等,但没有任何积极的结果

Rest API返回在.then()中提取的响应。下面是rest API调用:

return this.http.request(url, options).toPromise()
        .then((response: any) => this.extractData(response))
        .catch((error: any) => this.handleError(error));
对RESTAPI的阻塞同步调用而不是异步调用会有帮助吗


不确定我需要做什么来缓解此问题。非常感谢您的帮助。

在从Angular 2.2更新到6.0后,更改同步功能按预期工作。i、 当数据从服务器到达时,它将显示在UI中。错误在开发模式下继续。

您能否创建一个简单的StackBlitz项目来复制此问题?StackBlitz.comHi Siddharth,感谢您的回复。正如您所建议的,我创建了一个示例项目,以与开发环境类似的方式重现该场景。然而,它在stackblitz上起了作用。但是,不能在我的开发环境中工作。我正在使用Typescript编译器@2.3.4。这会是一个问题吗?角度版本有什么不同吗?StackBlitz使用Angular 6,甚至我也见过它在Angular 6上工作。但在Angular 5或更早版本中,我们在检查了表达式的错误后,确实更改了表达式。谢谢Siddharth。由于这个原因,我从角度2移动到角度6。然而,他们面临着移民障碍。当我在Angular 6上工作或面临相同问题时,我将Angular更新为6.0,数据显示得很顺利。但是,错误显示在dev模式下,这对我来说很好。看起来Angular 2.2当时并没有很好地处理变更管理。不知何故,我无法理解这样一个核心功能是如何被破坏的,并被谷歌错误地称为正常工作的。