Javascript 变化检测不';在同步代码中不会发生这种情况

Javascript 变化检测不';在同步代码中不会发生这种情况,javascript,angular,typescript,Javascript,Angular,Typescript,我正在开发一个组件,它有一个按钮,可以切换布尔值。该布尔值用于确定HTML中的子组件是否需要重新呈现,因为我希望子组件中的ngOnInit函数重新运行 应用程序组件中描述了这种情况: app.component是父组件,second.component是子组件 我尝试了三种不同的解决方案。它们是app.component.ts中的onTestClickOne、onTestClickTwo和onTestClickTwoonTestClickOne和onTestClickTwo成功地重新触发子组件中

我正在开发一个组件,它有一个按钮,可以切换布尔值。该布尔值用于确定HTML中的子组件是否需要重新呈现,因为我希望子组件中的
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
    引用

    它工作良好,没有任何检测问题