Angular Material 18+ 高级教程 – CDK Observers
前言
Observers 是 Angular Material 对游览器原生 MutationObserver 的上层封装。主要用于监听 add/remove Node。
不熟悉的朋友可以先看这篇 DOM – MutationObserver。
ContentObserver
ContentObserver 是一个 Root Service Provider,类似 class MutationObserver。
它的用法非常直观
export class TempComponent {
constructor() {
const contentObserver = inject(ContentObserver);
const hostElement = inject(ElementRef);
const mutationRecords$ = contentObserver.observe(hostElement);
afterNextRender(() => {
mutationRecords$.subscribe(records => console.log(records));
});
}
}
inject ContentObserver,然后 observe Element / ElementRef,
返回 RxJS Observable<MutationRecord[]>。
subscribe 后它就开始监听了。
逛一逛源码
ContentObserver 的源码在 observe-content.ts
我们直接从 ContentObserver.observe 看起吧。

它不支持 observe document 哦。
_observeElement 方法

这个工厂函数长这样

每一次执行 contentObserver.observe 内部就会调用 MutationObserverFactory.create 创建一个 MutationObserver 对象。
继续

options 是写死的,我们无法配置,它会监听子孙层 add/remove element 和 text node。
回到 ContentObserver.observe


主要就是无视 comment,很多 comment 都是 Angular 自己要用的,比如 <ng-container />, <ng-template> 这些都是 comment,开发者一般上是不想监听这些的,所以它过滤掉。
总结:
每一次 observe 都会创建一个原生 MutationObserver 对象
wrap RxJS Observable
options 写死,监听子孙 add/remove element 和 text node (attribute 变化它监听不到哦)
过滤掉 comment add/remove 的 MutationRecord,因为这些多半是 Angular 专用的
CdkObserveContent 指令
CdkObserveContent 指令内部用的是 ContentObserver,所以它又只是一个上层封装而已。
import ObserversModule

然后 apply 指令
<div cdkObserveContent
(cdkObserveContent)="handleContentChanges($event)"
[cdkObserveContentDisabled]="false"
[debounce]="100">
</div>
它可以调一些小配置,比如 disabled,debounce 是 RxJS 的 debounceTime。
$event 就是 MutationObserver 发布的 MutationRecord[]。
目录
上一篇 Angular Material 18+ 高级教程 – Overlay
下一篇 Angular Material 18+ 高级教程 – Material Tooltip
想查看目录,请移步 Angular 18+ 高级教程 – 目录
喜欢请点推荐,若发现教程内容以新版脱节请评论通知我。happy coding
Angular Material 18+ 高级教程 – CDK Observers的更多相关文章
- Angular Material 教程之布局篇
Angular Material 教程之布局篇 (一) : 布局简介https://segmentfault.com/a/1190000007215707 Angular Material 教程之布局 ...
- Angular Material TreeTable Component 使用教程
一. 安装 npm i ng-material-treetable --save npm i @angular/material @angular/cdk @angular/animations -- ...
- Angular Material design设计
官网: https://material.io/design/ https://meterial.io/components 优秀的Meterial design站点: http://material ...
- angular使用@angular/material 出现"export 'ɵɵinject' was not found in '@angular/core'
WARNING in ./node_modules/@angular/cdk/esm5/a11y.es5.js 2324:206-214 "export 'ɵɵinject' was not ...
- Material使用11 核心模块和共享模块、 如何使用@angular/material
1 创建项目 1.1 版本说明 1.2 创建模块 1.2.1 核心模块 该模块只加载一次,主要存放一些核心的组件及服务 ng g m core 1.2.1.1 创建一些核心组件 页眉组件:header ...
- Siki_Unity_2-9_C#高级教程(未完)
Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...
- Angular Material Starter App
介绍 Material Design反映了Google基于Android 5.0 Lollipop操作系统的原生应用UI开发理念,而AngularJS还发起了一个Angular Material ...
- 关于 Angular引用Material出现node_modules/@angular/material/button-toggle/typings/button-toggle.d.ts(154,104): error TS2315: Type 'ElementRef' is not generic.问题
百度了好久 ,,,最后谷歌出来了.. 该错误可能来自于您将@ angular / material设置为6.0.0, 但所有其他Angular包都是5.x.您应该始终确保Material主要版本与An ...
- Angular Material & Hello World
前言 Angular Material(下称Material)的组件样式至少是可以满足一般的个人开发需求(我真是毫无设计天赋),也是Angular官方推荐的组件.我们通过用这个UI库来快速实现自己的i ...
- 基于 Angular Material 的 Data Grid 设计实现
自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...
随机推荐
- SqlServer内置函数和使用
聚合函数 -> MAX(字段) -> MIN(字段) -> AVG(字段) •-> 在计算时,对于null的数据不计入总是 -> SUM(字段) -> COUNT( ...
- 拯救SQL Server数据库事务日志文件损坏的终极大招
拯救SQL Server数据库事务日志文件损坏的终极大招 在数据库的日常管理中,我们不可避免的会遇到服务器突然断电(没有进行电源冗余),服务器故障或者 SQL Server 服务突然停掉, 头大的是l ...
- 开启GitLab的邮件通知功能以及一些外观配置
前言 维护GitLab的同事离职了 刚好又有新实习生需要申请账号 只能我来出手了 其实之前安装了 GitLab 之后一直还是用得比较粗糙的 属于是勉强能用的水平,有些配置都还没改好 这次把邮件功能.域 ...
- [oeasy]python0083_十进制数如何存入计算机_八卦纪事_BCD编码_Binary_Coded_Decimal
编码进化 回忆上次内容 上次 研究了 视频终端的 演化 从VT05 到 VT100 从 黑底绿字 到 RGB 24位真彩色 形成了 VT100选项 从而 将颜色 数字化 了 生活中我们更常用 10个数 ...
- MySQL之DCL
DCL * 一个项目创建一个用户!一个项目对应的数据库只有一个! * 这个用户只能对这个数据库有权限,其他数据库你就操作不了了! 1. 创建用户 * CREATE USER 用户名@IP地址 ID ...
- java面试一日一题:mysql的索引下推了解吗
问题:请问你了解索引下推吗 分析:该问题主要考察对mysql优化方面的理解 回答要点: 主要从以下几点去考虑, 1.mysql中索引的概念? 2.索引下推的理解及意义? 在面试过程中问到mysql,必 ...
- Jmeter函数助手10-regexFunction
regexFunction函数用于对上一个请求进行正则表达式提取处理,类似正则表达式. 用于从前一个请求搜索结果的正则表达式:填入正则表达式 Template for the replacement ...
- web3 产品介绍 MyEtherWallet 方便和智能合约交互的钱包
MyEtherWallet(简称MEW)是一款流行的去中心化以太坊钱包,它允许用户在安全且简单的界面中管理自己的以太坊资产.在本文中,我们将介绍MyEtherWallet的主要特点.功能以及如何使用它 ...
- 【Spring Data JPA】04 JPQL和原生SQL
@Transactional注解 让Spring处理事务 不需要自己每次都手动开启提交回滚 FINDONE & GETONE的区别? findone是立即加载 getone是延迟加载,配合事务 ...
- 【Vue】07 Webpack Part3 Loader
Loader是Webpack的核心概念: 除了JS文件以外我们还有CSS,图片,包括一些ES6规范的代码 或者是TypeScript各种前端类型的文件 但是最终必须统一转换成JS文件,Webpack本 ...