Javascript 变化检测不';在同步代码中不会发生这种情况
我正在开发一个组件,它有一个按钮,可以切换布尔值。该布尔值用于确定HTML中的子组件是否需要重新呈现,因为我希望子组件中的Javascript 变化检测不';在同步代码中不会发生这种情况,javascript,angular,typescript,Javascript,Angular,Typescript,我正在开发一个组件,它有一个按钮,可以切换布尔值。该布尔值用于确定HTML中的子组件是否需要重新呈现,因为我希望子组件中的ngOnInit函数重新运行 应用程序组件中描述了这种情况: app.component是父组件,second.component是子组件 我尝试了三种不同的解决方案。它们是app.component.ts中的onTestClickOne、onTestClickTwo和onTestClickTwoonTestClickOne和onTestClickTwo成功地重新触发子组件中
ngOnInit
函数重新运行
应用程序组件中描述了这种情况:
app.component
是父组件,second.component
是子组件
我尝试了三种不同的解决方案。它们是app.component.ts
中的onTestClickOne
、onTestClickTwo
和onTestClickTwo
onTestClickOne
和onTestClickTwo
成功地重新触发子组件中的ngonit
。我们可以看到控制台日志,每当我单击相应的按钮时,它就会打印在控制台上。但是,onTestClickThree
不起作用
我不能100%确定为什么onTestClickThree
不起作用,而onTestClickThree
起作用
我的猜测如下:
onTestClickTwo
之所以有效,是因为Angular中的更改检测是在执行事件处理程序之后运行的。因此,它将检测布尔值是否已设置为true。之后,事件循环将获取setTimeout的回调并将其放入堆栈中。Angular将在完成回调后执行更改检测onTestClickThree
不起作用,因为在Angular runs change detection时,布尔值已经为真。Angular不知道它已经改变了让我们来解决这里的主要问题,这是您的设计:为什么要重新渲染组件以再次触发
ngOnInit
当然,以你的例子来说,这没什么大不了的。但是,对于一个完全编码的组件,进行http调用,生孩子等等,会发生什么呢?这将导致一些严重的性能问题
您不应该重新呈现组件,而应该使用函数来执行此操作
如果事件(最初应该重新呈现组件)来自子级,则使用@输出。如果它来自父级,请使用@ViewChild
引用
它工作良好,没有任何检测问题