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的执行顺序. 看一段三个指令嵌套的 ...
随机推荐
- 【Unity3D与23种设计模式】中介者模式(Mediator)
GoF中定义: 定义一个接口来封装一群对象的互动行为 中介者通过移除对象之间的引用 以减少他们之间的耦合度 并且能改变它们之间的互动独立性 游戏做的越大,系统划分的也就越多 如事件系统,关卡系统,信息 ...
- EOS 开发进展速报
Daniel Larimer 刚刚披露了 EOS 的最近开发进展,原文 :https://steemit.com/eos/@dan/ukoxz-eos-io-development-update 为了 ...
- 我的linux一万小时
这不是一篇鸡汤文,因为我并没有在使用 Linux 一万小时后成为 Linux 达人,甚至在很多方面,我连新手都算不上.我走的这些弯路能篇成一本很有参考价值的反面教材,下面,我在www.itxdl.cn ...
- css实现div中图片高度自适应并与父级div宽度一致
需求:1.父级div不设置高度 2.图片高度自适应,并且显示为正方形: 以前遇到列表中图片高度必须和父级宽度相同,并且需要为正方形的时候,最开始的方法是定死图片高度,这样会导致不同分辨率下图片会压缩, ...
- Java运行时内存划分
这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...
- 笔记:MyBatis 使用 Java API配置
我们已经讨论了各种MyBatis配置元素,如envronments.typeAlias和typeHandlers,以及如何使用XML配置它们.即使你想使用基于JavaAPI的MyBatis配置,MyB ...
- Acer Aspire E1 471G 加装SSD+机械盘后无法启动的问题
老笔记本 Acer Aspire E1 471G 加装了一块 SSD 作为系统盘(win10),原机械盘格式化后,装在光驱托架上作为数据盘. 可能会出现: 系统无法启动,显示找不到启动设备,并且在F2 ...
- Linux 如何使用echo指令向文件写入内容
0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容 ...
- 【Python】 魔法方法
魔法方法 这个名字真的很中二有没有 = =(或者说翻译气息太浓了,作为一个学外语的看到这种真是想吐槽的不行..) 从形式上来说,在方法的名字前后个加上两条下划线的就是魔法方法了 .从功能上说,所有魔法 ...
- [luogu2831][noip d2t3]愤怒的小鸟_状压dp
愤怒的小鸟 noip-d2t3 luogu-2831 题目大意:给你n个点,问最少需要多少条经过原点的抛物线将其覆盖. 注释:1<=点数<=18,1<=数据组数<=30.且规定 ...