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 组件库 ...
随机推荐
- Oracle 删除大量表记录操作总结
By:授客 QQ:1033553122 删除表数据操作 清空所有表记录 TRUNCATE TABLE your_table_name; 或者批量删除满足条件的表记录 BEGIN LOOP DELETE ...
- WorPress基础之谷歌GSC与GA统计代码安装
本篇文章讲介绍什么是GSC和GA以及如何安装. 什么是GSC GSC,全称为Google Search Console,由谷歌官方提供的网站管理工具,可帮助监控和维护网站在Google 搜索结果中的展 ...
- 一键语法错误增强工具 ChineseErrorCorrector
一键语法错误增强工具 欢迎使用我最近开源的使用一键语法错误增强工具,该工具可以进行14种语法错误的增强,不同行业可以根据自己的数据进行错误替换,来训练自己的语法和拼写模型,希望推动行业文本纠错的发展, ...
- java实现二维码登录功能
本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码: <?xml version="1.0" encoding="UTF- ...
- 支付宝退款和结果查询接口简单实现(.Net 7.0)
〇.前言 支付宝对 .Net 的支持还是比较充分的,在每个接口文档中都有关于 C# 语言的示例,这样就大大降低了对接的难度,很容易上手. 官方接口文档地址:退款-alipay.trade.refund ...
- 大厂面经: 字节跳动 iOS开发实习生-飞书
好家伙, 线上面试,总时长1h30mins左右 整体流程: 0.自我介绍(0-2mins) 1.做的比较难的事情(15min) 我讲我之前写的一个低开平台,写了一个撤销回退功能,提了个pr,用了节流, ...
- xshell打开vim后颜色异常——xshell连接ubuntu打开vim后界面覆盖一层绿色
参考原文: https://blog.csdn.net/Blank_Shen/article/details/106527312 =================================== ...
- [rCore学习笔记 022]多道程序与分时任务
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 思考 ...
- 一步步开发Windows服务(Windows Service)[转]
基于0起步来创建一个服务,做到简单的记录时间日志功能,其具体招行方法可自行添加. 1.创建服务 2.删除默认服务文件 3.添加自己的服务文件 4.更改启动项目 5. 引用 using System.T ...
- QT中Table Widget树控件的使用
关于Item Widgets中Table Widget的使用方法!了解在QT程序中插入表格得操作! Table Widget树控件的使用 1.创建数据及其初始化Table控件 // 创建一英雄列表,一 ...