haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.32k stars 3.25k forks source link

[angular] 第1873天 请说说在Angular中的摘要循环过程是什么? #5835

Open haizhilin2013 opened 4 months ago

haizhilin2013 commented 4 months ago

第1873天 请说说在Angular中的摘要循环过程是什么?

3+1官网

我也要出题

llccing commented 3 months ago

在Angular框架中,摘要循环(digest cycle)是Angular变更检测机制的一部分,用于确保模型和视图之间的同步。摘要循环是AngularJS(Angular 1.x)中的一个核心概念,但在Angular(Angular 2+)中则有所不同。以下分别介绍在AngularJS和Angular中的摘要循环过程。

AngularJS(Angular 1.x)中的摘要循环

  1. 触发事件

    • 用户交互(如点击按钮、输入数据)、HTTP响应、定时器(如$timeout$interval)等都可以触发摘要循环。
  2. 脏检查(Dirty Checking)

    • AngularJS使用脏检查机制来检测数据模型的变化。它会检查作用域中的每一个监视器(watcher),比较当前值和前一个值。如果有变化,则触发相应的回调函数。
  3. 执行摘要循环

    • 摘要循环会运行多次(通常最多10次),以确保所有的变化都被捕获和处理。如果在10次循环后数据仍在变化,AngularJS会抛出一个异常,防止无限循环。
  4. 更新DOM

    • 当所有变化都被捕获后,AngularJS会更新视图(DOM),以反映模型的最新状态。

Angular(Angular 2+)中的变更检测

Angular 2+中不再使用摘要循环,而是采用了基于区域(zones)的变更检测机制,主要通过NgZoneChangeDetectorRef来管理变更检测。

  1. 触发变更检测

    • 在Angular应用中,任何异步事件(如HTTP请求、用户输入、定时器等)都会触发变更检测。
  2. Zone.js

    • Angular使用Zone.js来拦截异步事件。当这些事件发生时,Zone.js会通知Angular进行变更检测。
  3. 变更检测策略

    • 默认情况下,Angular会自动检测整个组件树中的变化。这种策略被称为Default策略。
    • 开发者可以选择OnPush策略,这种策略只有在输入属性(@Input)发生变化时才会触发变更检测,以提高性能。
  4. ChangeDetectorRef

    • 开发者可以通过ChangeDetectorRef手动触发或控制变更检测,例如调用markForCheckdetectChanges等方法。
  5. 变更检测的过程

    • Angular会从应用的根组件开始,递归检测每个子组件,检查数据模型的变化,并更新视图。
  6. 生命周期钩子

    • 在变更检测过程中,Angular会调用组件的生命周期钩子(如ngOnInitngDoCheckngAfterViewInit等)来执行相关逻辑。

总结

通过了解这些变更检测机制,可以帮助开发者更好地优化Angular应用的性能和响应速度。

llccing commented 3 months ago

在Angular 2+中,变更检测(Change Detection)是一个核心机制,用于确保视图与模型数据保持同步。Angular使用一种称为“脏值检测”的机制来实现这一点,但与AngularJS不同,它更高效且灵活。以下是对Angular 2+变更检测的详细说明:

1. Zone.js和NgZone

2. 变更检测策略

Angular提供了两种主要的变更检测策略:

3. ChangeDetectorRef

ChangeDetectorRef是Angular提供的一个类,允许开发者手动控制变更检测。主要方法包括:

4. 生命周期钩子

在变更检测过程中,Angular会调用组件的生命周期钩子。主要包括:

5. 变更检测的过程

  1. 事件触发

    • 当用户交互、HTTP响应、定时器等异步事件发生时,Zone.js会拦截这些事件,并通知Angular进行变更检测。
  2. 检查根组件

    • Angular从应用的根组件开始,递归地检查每个子组件,判断其数据模型是否发生变化。
  3. 更新视图

    • 如果检测到数据变化,Angular会更新对应的视图,以确保视图和数据模型保持同步。
  4. 触发生命周期钩子

    • 在变更检测过程中,Angular会调用相关的生命周期钩子,允许开发者执行自定义逻辑。

总结

Angular 2+中的变更检测机制通过Zone.js和NgZone自动管理异步操作,并提供了灵活的变更检测策略和手动控制方法(ChangeDetectorRef),使得变更检测过程更加高效和可控。理解和善用这些机制,可以帮助开发者优化Angular应用的性能和响应速度。