首页 > 其他分享 >angular-变更检测流程理解

angular-变更检测流程理解

时间:2024-10-29 10:49:58浏览次数:2  
标签:检测 流程 视图 ViewChild 钩子 组件 angular 变更

变更检测是在js事件循环过程中,将组件的数据变化反映到视图上的一种机制

具体过程如下:

 

几点关键的:

1、子组件的ngonchange ngDoCheck ngAfterContentChecked 是在父组件更新dom(第9步)前完成

2、在所有子组件的afterViewChecked钩子执行之前,父组件的ViewChild查询表就会更新,在所有子组件的afterViewChecked钩子执行之后,父组件的AfterViewChecked钩子会执行

3、给组件设置了onpush策略,会影响的是组件是否执行变更检测,但是组件的ngonchange, ngdocheck,ngaftercontentchecked钩子照样执行,ngafterviewchecked钩子也会执行,即使跳过了变更检测

4、细化下第4条步骤,第4条的嵌套视图指的是:组件内的视图容器所包含的实例,

考虑组件设置了onpush的场景,若嵌套视图的来源组件是本组件,因为本组件未参与变更检测,那么该视图实例不参与变更检测;若嵌套视图的来源组件参与了本次变更,那么视图实例参与变更检测
若组件为默认策略,那么嵌套视图都参与变更检测,与来源组件无关

 

第4条的疑问由下面的场景衍生思考而来

 

zorro的树组件接收templateRef作为输入,但是zorro的所有组件检测策略默认都是onpush模式,

现象是:在修改了节点的属性(online 及 total值)后,dom变更处的dom能刷新。但是并没有修改组件输入值的引用,也就意味着tree组件的变更检测没有执行,那为什么dom变更处的dom能刷新呢?

 

例子----理解变更检测在js时间循环中处于什么位置

 

区域分析组件订阅了树组件的事件,点击区域树组件的收缩按钮,区域分析组件调用ngx-datatable的recaculate,重新计算表格的尺寸,完成

树组件的收缩样式由区域分析组件的tabWidthStatus变量控制,tabWidthStatus变量在区域分析组件的changeWidth函数中修改

树组件

 

 

区域分析组件

changeWidth emit事件回调

 

订阅函数如下,在计算表格尺寸的时候,需要加上一个延时整个功能才能完美

 

仔细分析,这里存在一个时序的问题,对于这个过程分析如下:

 

若是不加延时的话,步骤5会在步骤二的位置执行,这样计算表格尺寸还是基于老的样式

 

这里添加另外一个情况,对于最左侧二级目录收缩,也需要对表格重新计算尺寸。二级目录加了200ms动画,而表格的尺寸要依赖动画过后的dom尺寸,所以为了适配上面这两种收缩的情况,最终要加300ms延时

 

例子----理解变更检测流程内部viewChild的获取时机

在组件中可以通过ViewChild装饰器获取组件模板中的templateRef, elementRef, ViewContainer。

这里以典型的获取TemplateRef作例子,ngx-datatable表格组件中需要操作栏,操作栏需要自定义,

 

在模板中使用ng-template标签定义模板(注意这个模板不要定义在第二个ngIf标签内部,具体原因往下看)

 

 

组件代码中通过@ViewChild装饰器获取,并且在ngAfterViewInit钩子函数之后才能拿到

 

在angular7版本之后,所有的ViewChild都在ngAfterViewInit钩子函数之后才能拿到(很好理解,只有当View准备好之后,才能获取VIewChild);

 

回到之前的问题,为什么把ng-template放在ngIf中,就获取不到呢?

仔细看看变更检测流程的第11步,当前组件的ViewChild更新会在子组件变更检测结束之后进行,ngIf指令作为子组件,会判断输入是否为true,因为页面默认展示第一个tab,所以第二个ngIf的输入初始为false,所以在ngIf结束检测之后,ng-tamplate就不存在,所以通过ViewCHild自然获取不到;

 

备注:angular老版本ViewChild是在ngonInit时就会获取的,所以不存在上面说的问题,这里特别强调的是angular7版本之后

标签:检测,流程,视图,ViewChild,钩子,组件,angular,变更
From: https://www.cnblogs.com/querybest/p/18512466

相关文章

  • Angular 19 "要" 来了⚡
    前言Angular19预计会在11月中旬发布,目前(2024-10-27)最新版本是v19.0.0-next.11。这次v19的改动可不小哦,新增了很多功能,甚至连effect都breakingchanges了呢......
  • 500多种目标检测数据集下载地址汇总(YOLO、VOC)
    名称辣椒病害分类数据集9076张12类别.7z【目标检测数据集】光伏电池异常检测数据集VOC+YOLO格式219张2类别_2.zip【目标检测数据集】钢丝绳破损灼伤缺陷检测数据集VOC+YOLO格式1318张2类别.7z【目标检测数据集】狗狗数据集5912张VOC+YOLO格式.zip【目标检测数据集】工地安全帽......
  • ▲基于CNN卷积神经网络的QPSK信号检测matlab仿真,对比CNN不同卷积层个数对检测性能影
    目录1.QPSK调制信号简介2.CNN基本原理3.基于CNN的QPSK信号检测原理4.MATLAB程序4.仿真结果5.完整程序下载    在现代通信系统中,信号检测是一个至关重要的环节。随着深度学习技术的发展,卷积神经网络(ConvolutionalNeuralNetwork,CNN)在信号处理领域展现出......
  • 基于车道检测与跟踪
                                      读了车道检测这个论文,我理解了利用matlab对车道识别算法进行仿真研究,从仿真的结果中提出具有一定实时性鲁棒性的识别方法。车道检测是智能车辆发展的智能因素。近年来对这项目的研究都是针对特定的环境......
  • 基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码
    背景及意义吸烟行为检测对于维护公共场所的健康环境、防止火灾事故的发生以及促进健康生活方式都具有重要作用。使用基于YOLOv8的吸烟行为检测系统能够有效识别视频中的吸烟行为,从而及时采取适当措施。本文基于YOLOv8深度学习框架,通过2357张图片,训练了一个进行吸烟行为的......
  • 基于YOLOv10/YOLOv9/YOLOv8深度学习的工业螺栓螺母检测系统【python源码+Pyqt5界面+数
    背景及意义工业螺栓螺母检测系统的实施显著提高了制造行业的产品质量和工作效率。该系统的应用涵盖了从生产、检查到包装等各个环节,为精密设备的维护和安全运行提供了强大的技术支持。本文基于YOLOv10/YOLOv9/YOLOv8深度学习框架,通过2548张工业螺栓螺母的相关图片,训练了可......
  • 基于YOLOv10/v9/v8深度学习的金属焊缝缺陷检测系统【python源码+Pyqt5界面+数据集+训
    背景及意义金属焊缝缺陷检测系统的实现显著提高了众多工业领域产品的安全性和可靠性。自动化的检测过程不仅增加了工作效率,还降低了人力成本和事故风险。本文基于YOLOv10/v9/v8深度学习框架,通过3170张金属焊缝缺陷的相关图片,训练了可进行焊缝缺陷目标检测的模型,可以分别......
  • 基于YOLOv8深度学习的人脸面部口罩检测系统【python源码+Pyqt5界面+数据集+训练代码】
    背景及意义人脸口罩面部检测能够准确地检测人脸是否佩戴口罩,对于控制疫情传播、保障公共卫生安全起到关键作用。本文基于YOLOv8深度学习框架,通过853张图片,训练了一个进行人脸面部口罩的目标检测模型,能够准确的检测人脸“戴口罩”、“未戴口罩”及“未正确佩戴口罩”。并基......
  • 【C++练习】基于函数嵌套调用的点餐流程
    题目:基于函数嵌套调用的点餐系统实现描述:        需要实现一个简化的点餐系统,该系统能够处理多位顾客的点餐、支付以及提供食物的过程。系统的主要流程通过函数嵌套调用来实现,包括展示菜单、点餐、生成账单、支付以及提供食物等功能。具体要求:菜单展示:使用 showMe......
  • 本人高分硕士论文项目:工业异常检测基准引擎
    1.架构如图所示,IADBE(IndustrialAnomalyDetectionBenchmarkEngine)系统由三个主要部分组成:IADBE、IADBE服务器和IADBE后台。IADBE是系统的核心,API和CLI是网关。数据集、模型和指标是系统最重要的部分。模型基于开源的Anomalib和YOLOv8。系统有三个主要入口:训练、......