Angular 何时使用ChangeDetectorRef(角度)

Angular 何时使用ChangeDetectorRef(角度),angular,Angular,我一直在做一个项目,我看到人们使用变更检测器 cdRef.detectChanges() 对于何时显式地使用它来标记组件已更改,我有点困惑。我们什么时候该让他决定?还是我在这里遗漏了什么?基本上有一种叫做“更改检测树”的东西:它收集所有检查更改的视图 ChangeDetectorRef允许您操作此树,angular会在每次发生更改时运行更改检测。例如,当您有大量数据且该数据发生更改时,angular将再次渲染视图,如果数据每秒更改一次,则应用程序将变慢 你可以做的一件事是;使用ref.deta

我一直在做一个项目,我看到人们使用变更检测器

cdRef.detectChanges()

对于何时显式地使用它来标记组件已更改,我有点困惑。我们什么时候该让他决定?还是我在这里遗漏了什么?

基本上有一种叫做“更改检测树”的东西:它收集所有检查更改的视图

ChangeDetectorRef允许您操作此树,angular会在每次发生更改时运行更改检测。例如,当您有大量数据且该数据发生更改时,angular将再次渲染视图,如果数据每秒更改一次,则应用程序将变慢

你可以做的一件事是;使用
ref.detach()
(将此视图从更改检测树中分离)从树中分离视图,以便您可以决定何时更新视图,为此,您可以使用
ref.detectChanges()
本地检测组件中的更改

还有一种叫做
ChangeDetectionStrategy
,当您的组件中有@Inputs时,它就起作用了。如果在组件中使用
changeDetection:ChangeDetectionStrategy.OnPush
,angular将只检查一次

使用CheckOnce策略,这意味着通过将策略设置为默认值(CheckAlways),自动更改检测将停用,直到重新激活。仍然可以显式调用更改检测。此策略适用于所有子指令,不能被重写

使用这个,angular迫使我们处理不可变的对象,所以如果你想更新视图,你必须向@Input传递一个新对象。但是,如果您有一个内部状态,您希望在每次单击按钮时更新它,那么会发生什么呢?除非您显式地调用更改检测,否则它将无法工作

因此,您可以尝试
ref.detectChanges()
对组件及其子组件运行更改检测,或者
ref.markForCheck()
它不会触发更改检测,而是将所有onPush祖先标记为要检查一次