【问题标题】:Angular2 component ngDoCheck is endlessly executedAngular2 组件 ngDoCheck 被无休止地执行
【发布时间】:2017-07-02 17:53:02
【问题描述】:

我有一个简单的 angular2 组件,它只包含一个 ag-grid 组件,并绑定了一些数据。

我的组件实现了DoCheck,组件中实现了ngDoCheck方法。

export class AppComponent implements DoCheck 
{
    ngDoCheck() {
        console.log('do check..');
    }
} 

我意识到 ngDoCheck 函数总是在无休止地运行。

关于这个问题的任何解释。

【问题讨论】:

  • 所有浏览器都会出现这种情况吗?这只是我在 safari 上的一个问题

标签: angular ag-grid angular2-docheck ag-grid-ng2


【解决方案1】:

这个钩子被非常频繁地调用——在每个变化检测周期之后,无论变化发生在哪里。

这是一个非常肮脏的循环,实际上甚至 Angular 本身都建议使用更合适的方式来实现自定义检查。

https://angular.io/docs/ts/latest/api/core/index/DoCheck-class.html

【讨论】:

  • 我遇到了同样的问题。即使我们不使用这个钩子,它会不会仍然不断地射击。有没有办法找出什么是无休止的变化?
  • 好吧,每次运行更改检测时都检查运行,这个答案给出了一些提示,说明如何检查触发更改检测的内容stackoverflow.com/questions/43661242/…,或者在某些情况下可能有用手动控制更改检测通过设置 @component({changeDetection:ChangeDetectionStrategy.OnPush}) 更改该组件(及其子组件)中的更改检测策略,然后使用 ChangeDetectorRef 手动控制它
  • 导致它无限运行的可能原因是您可能在任何组件中使用了 ChangeDetectorRef 并且您可能没有未订阅的订阅变量。
【解决方案2】:

在我的情况下,ngAfterViewChecked 被无休止地调用,因为 sentry.js 对 console.log 进行猴子修补,从而触发更改检测。 我拔掉了一半的头发,直到注意到下面的代码因为哨兵而导致循环。

ngAfterViewChecked () {

    console.log('Rendered');

}

【讨论】:

  • @Kamil 只是不要在 ngDoCheck 和其他生命周期挂钩中调用 console.log
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多