Angular2 中的 ChangeDetectionStrategy 是什么以及何时使用 OnPush 与 Default

作者:编程家 分类: angular 时间:2025-10-28

# Angular2 中的 ChangeDetectionStrategy 以及 OnPush 与 Default 的使用

Angular2 中的 `ChangeDetectionStrategy` 是一种机制,用于控制何时以及如何执行变更检测。变更检测是 Angular 中用于检测模型(数据)变化并更新视图的过程。在 Angular 中,有两种主要的变更检测策略:`Default` 和 `OnPush`。

## 默认策略(Default)

默认策略是 Angular 中的标准变更检测策略。这意味着每当发生事件、Ajax 请求或用户交互时,Angular 将检查整个组件树以查找变化。这样,无论模型中的数据是否发生变化,都会触发变更检测。

在默认策略下,Angular 会在每个组件的每个变更检测周期中检查其所有子组件,无论它们的状态是否发生变化。这可以确保在任何可能的情况下都能捕获到变化,但可能导致性能开销。

## OnPush 策略

`OnPush` 是另一种 `ChangeDetectionStrategy`,它提供了一种更加精细的控制方式。当使用 `OnPush` 策略时,Angular 只会在以下情况下才执行变更检测:

1. 当输入属性发生变化时。

2. 当组件或指令自身触发了事件处理器时。

3. 当通过 `ChangeDetectorRef` 手动调用 `detectChanges` 方法时。

使用 `OnPush` 策略可以显著提高性能,因为它减少了不必要的变更检测。但是,要正确使用 `OnPush`,开发者需要小心管理组件的状态以确保变更检测的触发条件满足。

## 代码示例

让我们通过一个简单的 Angular 组件来演示 `Default` 和 `OnPush` 策略的差异:

typescript

import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';

@Component({

selector: 'app-item',

template: `

{{ item.name }}

`,

changeDetection: ChangeDetectionStrategy.OnPush // 可以改为 ChangeDetectionStrategy.Default 进行对比

})

export class ItemComponent {

@Input() item: { name: string };

constructor(private cdr: ChangeDetectorRef) {}

updateName() {

this.item.name = 'New Name';

// 如果使用 OnPush 策略,需要手动触发变更检测

this.cdr.detectChanges();

}

}

在上面的例子中,我们创建了一个简单的 `ItemComponent`,其中有一个输入属性 `item`,以及一个按钮用于更新 `item` 的 `name` 属性。通过将 `changeDetection` 设置为 `OnPush`,我们告诉 Angular 只有在输入属性变化或手动调用 `detectChanges` 时才执行变更检测。

##

在选择使用 `Default` 还是 `OnPush` 策略时,开发者需要权衡性能和复杂性。`OnPush` 策略能够提高性能,但需要开发者更加细致地管理组件状态。默认策略在大多数情况下都能够正常工作,但在性能要求较高的应用中,可能需要考虑使用 `OnPush` 策略来优化变更检测过程。