# 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` 策略的差异:typescriptimport { 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` 策略来优化变更检测过程。