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的执行顺序. 看一段三个指令嵌套的 ...
随机推荐
- animation,transform属性
animation属性 使用@keyfarmes属性开启动画步骤 结构体:@keyfarmes name{ from{ } to{ } } @keyfarmes name{ 0%{ } 50%{ } ...
- [Oracle]UNIX与Windows 2000上Oracle的差异(I)
作者:Ian Adam & David Stien, SAIC Ltd 日期:19-Dec-2003 出处:http://www.dbanotes.net翻译:Fenng ---------- ...
- 笔记:XML-解析文档-XPath 定位信息
如果需要定位某个XML文档中的一段特定信息,那么通过遍历DOM 树的众多节点来进行行查找显得有些麻烦,XPath语言使得访问树节点变得很容易,例如,下面的XML文档结构: <?xml versi ...
- 通过漫画轻松掌握HDFS工作原理
- Oracle/Hive/Impala SQL比较1
5 Function 指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大. 5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 ...
- 【Python】 docker-py 用Python调用Docker接口
[docker-py] 官方文档:[https://docker-py.readthedocs.io/en/stable/images.html] 众所周知,Docker向外界提供了一个API来管理其 ...
- STL --> remove和remove_if()
remove和remove_if() 一.Remove()函数 remove(beg,end,const T& value) //移除区间{beg,end)中每一个“与value相等”的元素: ...
- Spring Boot 2.0(六):使用 Docker 部署 Spring Boot 开源软件云收藏
云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring ...
- 2018.3.29 div内容格式设置
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 2018上C语言程序设计(高级)博客作业样例
要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...