Angular 学习笔记 ( CDK - Accessibility )
更新 : 2019-11-29
在使用 focus monitor 的时候要小心,
Expression has changed after it was checked 错误
原因是因为 focus monitor 监听的方式是 runOutsideAngular + list focus or blur
举个例子, 比如当我们触发一些事件后,修改属性,detech change,这个时候 ng 去渲染 element
比如删除 element, 这时 monitor 监听的 blur 就可能会被触发. 触发后就会马上调用我们的监听。
而如果我们的监听写了一些操作属性...markforcheck 的代码...boom
因为渲染过程还没有结束. 所以正确的方式是, 做一个延迟. 比如 settimeout, promise.relsove
确保渲染 ok 了才操作. 我觉得一个大原因是 monitor 用了 outside angular 所以这个 life cycle 我们就得自己留心了。
更新: 2019-11-21
学习资源 铁人30 天 : https://ithelp.ithome.com.tw/articles/10197071
@angular/ckd 是 ng 对于 ui 组建的基础架构.
是由 material 团队开发与维护的, 之所以会有 cdk 看样子是因为在开发 material 的时候随便抽象一个层次出来给大家用.
这系列是我按照官网教程和查了一下 angular/material 源码的学习笔记.
1. KeyManger
运用场景是 select, menu 这种有 list options 的组件, 负责处理键盘上下按钮时 option active 的逻辑
ng 提供了 3 个类 ListKeyManager, FocusKeyManager, ActiveDescendantKeyManager, focus 和 active 其实是继承了 ListKeyManager 大体上功能是一样的.
使用起来是很简单的 :
chip-list.ts
this._keyManager = new FocusKeyManager<MatChip>(this.chips).withWrap();
实例化时把所以的 options 丢进去, withWrap 表示支持循环, 注意 option 组件要实现 ListKeyManagerOption 接口, 这样 KeyManager 才能设置 active 丫
从 KeyManger 的几个方法就看出它的功能了. 源码
<div class="my-inner-dialog-content" cdkTrapFocus>
<!-- Tab and Shift + Tab will not leave this element. -->
</div>
如果我们一直按 tab 游览器会一直 focus to 下一个 element 游览器的地址上都可以 tab 到去.
那么设置了这个 focustrap 不管你怎么 tab 都走不出这个框框了.
ng 通过在这个 element 上下个别添加一个 focus element 来做出限制. 一旦 tab 到了下方的 element ng 就会 focus to 第一个 tabable 元素.
而如果和能找到第一个 tabable 元素呢 ? 那就是下一个要介绍的了
3. InteractivityChecker
这个能让我们检查到一个 element 是否 disabled, visible, tabbable, and focusable. 实现手法都是大量的游览器 dom api 等等, 而且也考虑了兼容性等等场景.
4. FocusMonitor
这个可以让我们检查到一个 element 被 focus 时是因为什么原因.
export type FocusOrigin = 'touch' | 'mouse' | 'keyboard' | 'program' | null;
有以上 5 种, origin 就是起源的意思. 有些交互设计会依据不同的 focus 方式不同的处理.
5. LiveAnnouncer
这是个 service, 用于 append 一个内容在 body, 做 aria 才会用到.
上面可以看出 CDK 对于开发来说最大的好处是避免了大量的 dom api 操作和游览器兼容. 在开发自己的 ui 组件尤其重要.
Angular 学习笔记 ( CDK - Accessibility )的更多相关文章
- Angular 学习笔记 ( CDK - Portal )
Portal 的主要使用场景是 dynamic component 动态的插入模板或组件. Portal 可分为 2 种. 进入和出去 (in or out) ComponentPortal, Tem ...
- Angular 学习笔记 (cdk focus monitor 和一些 focus tabindex 的基础)
更新 : 2019-12-22 focusInitialElementWhenReady 我们经常会调用到这个方法, 它的逻辑是这样 先看有没有 cdkFocusInitial 有的就 focus ...
- Angular 学习笔记 ( CDK - Overlays )
更新 : 2018-01-30 ng 的 overlap 在关闭的时候对 backdrop 做了一个 style pointer 目的是让 backdrop 不被 2 次点击, 但是呢, css p ...
- Angular 学习笔记 ( CDK - Layout )
简单说就是 js 的 media query. 1. BreakpointObserver const layoutChanges = this.breakpointObserver.observe ...
- Angular 学习笔记 ( CDK - Observers )
<div class="projected-content-wrapper" (cdkObserveContent)="projectContentChanged( ...
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
随机推荐
- 洛谷 P1025 数的划分
题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输 ...
- 2018-3 WebStorm最新版本破解方法
今天重新打开WebStorm发现之前输入的License Server没法用了,不能通过WebStorm的检测,搜索良久,终于找到了最新版本WebStorm的破解方法. 在激活页面选择License ...
- Java equals() 和hashCode()方法详解
Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个对象(引用地址) ...
- 【Unity3D与23种设计模式】游戏的主循环——Game Loop
游戏与其他软件最大的不同 就是游戏有Update逻辑 一般的软件是由"事件"驱动 因为它不会突然跑出来一只"兔子" 因此,只有游戏才有"帧" ...
- Atlas安装配置
准备环境 192.168.1.1(Altas) 192.168.1.2(MySQL主) 192.168.1.3(MySQL从) 官方链接:https://github.com/Qihoo360/Atl ...
- Mysql5.7动态修改innodb_buffer_pool_size
SELECT @@innodb_buffer_pool_size,@@innodb_buffer_pool_chunk_size,@@innodb_buffer_pool_instances; SET ...
- Node.JS开发环境准备
1.安装Nodejs的Windows包. 官网:http://nodejs.org/ 2.可以使用cmd运行nodejs项目,命令格式: node 文件名.js node 文件名 3.对于不熟悉的 ...
- FileReader对象的readAsDataURL方法来读取图像文件
FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Dat ...
- JVM学习五:JVM之类加载器之编译常量和主动使用
在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点. 一.类的初始化回顾 类在初始化的时候,静态变量的声明语句 ...
- KVM之五:KVM日常管理常用命令
1.查看.编辑及备份KVM 虚拟机配置文件 以及查看KVM 状态: 1.1.KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml 文件,如下,: ...