前言

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

shouldIgnoreRecord 函数

主要就是无视 comment,很多 comment 都是 Angular 自己要用的,比如 <ng-container />, <ng-template> 这些都是 comment,开发者一般上是不想监听这些的,所以它过滤掉。

总结:

  1. 每一次 observe 都会创建一个原生 MutationObserver 对象

  2. wrap RxJS Observable

  3. options 写死,监听子孙 add/remove element 和 text node (attribute 变化它监听不到哦)

  4. 过滤掉 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的更多相关文章

  1. Angular Material 教程之布局篇

    Angular Material 教程之布局篇 (一) : 布局简介https://segmentfault.com/a/1190000007215707 Angular Material 教程之布局 ...

  2. Angular Material TreeTable Component 使用教程

    一. 安装 npm i ng-material-treetable --save npm i @angular/material @angular/cdk @angular/animations -- ...

  3. Angular Material design设计

    官网: https://material.io/design/ https://meterial.io/components 优秀的Meterial design站点: http://material ...

  4. 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 ...

  5. Material使用11 核心模块和共享模块、 如何使用@angular/material

    1 创建项目 1.1 版本说明 1.2 创建模块 1.2.1 核心模块 该模块只加载一次,主要存放一些核心的组件及服务 ng g m core 1.2.1.1 创建一些核心组件 页眉组件:header ...

  6. Siki_Unity_2-9_C#高级教程(未完)

    Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...

  7. Angular Material Starter App

      介绍 Material Design反映了Google基于Android 5.0 Lollipop操作系统的原生应用UI开发理念,而AngularJS还发起了一个Angular Material ...

  8. 关于 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 ...

  9. Angular Material & Hello World

    前言 Angular Material(下称Material)的组件样式至少是可以满足一般的个人开发需求(我真是毫无设计天赋),也是Angular官方推荐的组件.我们通过用这个UI库来快速实现自己的i ...

  10. 基于 Angular Material 的 Data Grid 设计实现

    自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...

随机推荐

  1. 3.1 Y86-64指令集体系结构

    程序员可见的状态 这里的程序员即可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器.程序员可见的状态如下,有15个程序寄存器(%rax,%rbx等),三个一位的条件(ZF,OF,SF) ,程序 ...

  2. 有数大数据基础平台之智能运维平台EasyEagle介绍:集群队列篇

    他来啦,他来啦!大数据基础平台发布会中提到的智能运维平台,他来啦! 作为数据平台的用户们,下述问题一直困扰着我们: 集群资源水位如何,利用率如何,是否需要扩容? 队列为什么最近大量任务出现pendin ...

  3. [WPF] 脱机环境实现支持拼音模糊搜索的AutoCompleteBox

    AutoCompleteBox是一个常见的提高输入效率的组件,很多WPF的第三方控件库都提供了这个组件,但基本都是字符串的子串匹配,不支持拼音模糊匹配,例如无法通过输入ldh或liudehua匹配到刘 ...

  4. Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应

    什么是授权(Authorization)? 在 ASP.NET Core 中,授权(Authorization)是控制对应用资源的访问的过程.它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作 ...

  5. python对象之间的交互

    python对象之间的交互 先看看一般的类定义如下: class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 ...

  6. 一键导入抓包数据生成HTTP请求

    Jmeter一键导入抓包数据生成HTTP请求.路径:工具->Import from cURL 在弹框里粘贴cURL,点击"Create Test Plan"会自动生成HTTP ...

  7. 【Java】部门集合树状顺序展示

    一.需求效果: 表单的部门下拉选择时,可以展示部门的层级: 按照这个效果展示,但是不是树,还是原来的集合 二.实现方案: 用Java代码实现两个部分 1.展示Label效果处理 2.处理集合的树状排序 ...

  8. 【MySQL】30 备份与恢复

    1.备份命令: mysqldump -u用户名 -p 密码 -h 服务主机IP -P 端口号 \ 数据库名称 \ > 指定备份的sql脚本文件位置 ↓ # 文件位置样例: # C:\Users\ ...

  9. Google的TPU的Pallas扩展功能支持的数据类型

    地址: https://jax.readthedocs.io/en/latest/pallas/tpu.html jnp.float32 jnp.bfloat16 jnp.int* (all prec ...

  10. baselines算法库的安装——Ubuntu20.04系统使用anaconda环境配置

    baselines算法库不做过多介绍,个人认为这是公开是所有reinforcement learning算法库中最权威的,虽然没有后期更新,也就是没有了学术界的state of the art ,  ...