angular6 填坑之sdk的方法


Posted in Javascript onDecember 27, 2018

技术背景:angular + ant zorro

最为大型前端团队首选的前端技术框架,angular,在国内多少还是有些水土不服。本人将针对angular做个一系列的填坑分享。

坑一:sdk

angular的sdk不属于各个模块,直接挂载在body下面, ant design直接使用sdk,导致任何的弹出层,如select,dropdown,picker等在弹出来的时候自动创建覆盖全局的sdk,需要点击sdk才能关闭已打开的下拉。

明显需要点击两次才能出现一个下拉是产品们不能接受的。

解决方案有两个,一个是修改底层源码,抛弃sdk,明显成本巨大,而且bug会层出不穷,考虑不周全,建议缺少前端架构组的团队就不用考虑了。

本人选择了另外一个方案,有点取巧,但是能快速解决问题。

angular6 填坑之sdk的方法

步奏一:

将sdk缩小至1x1px,让鼠标可以点击网页中任意地方。

.cdk-overlay-backdrop {

  width: 1px!important;

  height: 1px!important;

}

步奏二:监听document点击事件

document.addEventListener('click', (e) => {
  this.prepareHideModal(e);

});

步奏三:获取当前点击的select等的唯一标识

使用sdk的组件比较多,有的有唯一标识,没有的特殊处理

getSign(e) {

    for (const v of e['path']) {

      if (v.tagName == 'NZ-SELECT' || v.tagName == 'APP-SUBJECTPICKER') {

        // 下拉框获取sign

        if (v.classList[0].includes('ng-tns-')) {

          this.sign = v.classList[0];

        } else {

          this.sign = v.classList[1];

        }

        this.signType = 'NZ-NORMAL';

        break;

      } else if (v.tagName == 'NZ-PICKER') {

        // picker 获取sign

        this.sign = v.classList[0];

        this.signType = 'NZ-PICKER';

        break;

      }

      // popover 获取sign

      if (v.getAttributeNode && v.getAttributeNode('nz-popover') && v.getAttribute('nz-popover') == '') {

        this.sign = 'NZ-POPOVER';

        this.signType = 'NZ-POPOVER';

        break;

      }

    }

  }

步奏四:关闭已打开的下拉组件

为什么叫prepareHideModal,这是获取sign前的操作,先关闭再去获取点击下拉的sign

getSign方法在关闭后执行

prepareHideModal(e) {

    let doClose = true;

    if (window['globalSignType']) {

      this.hideAllmodal();

      window['globalSignType'] = null;

      return;

    }

    // 如果有sign,关闭已打开的

    if (this.sign) {

      let _sign = this.sign;

      // 判断某些情况下不关闭弹框

      if (_sign == 'NZ-POPOVER') {

        // 解决没有特使标识时点击cdk本身不消失

        for (const v of e['path']) {

          if (v.classList && v.classList.contains('cdk-overlay-container')) {

            doClose = false;

          }

        }

      } else {

        // 常规有指定sign时点击选择器自身时不消失

        for (const v of e['path']) {

          if (v.classList && v.classList.contains(_sign)) {

            doClose = false;

            break;

          }

 

        }

      }

      doClose && this.hideModal(_sign);

    }

    this.getSign(e);

  }

步奏五:最重要的关闭sdk,这边采用了最简单的,模拟sdk点击,完全使用sdk自己的方法

hideModal(sign) {

    let cdkDom = document.querySelectorAll('.cdk-overlay-backdrop.cdk-overlay-dark-backdrop.cdk-overlay-backdrop-showing');

    let domLen = cdkDom.length;

    // 循环cdk,找到它自身的cdk,模拟点击隐藏

    for (var i = 0; i < domLen; i++) {

      var v = cdkDom[i];

      if (v['style'].display != 'none') {

        v['click']();

        break;

      }

    }

    this.sign = null;

    this.signType = null;

  }

至此算是解决了使用skd组件需要点击两次的坑,但是会引起另外一个坑,当页面出现滚动条时,已打开的下来组件位置不会跟着滚动而去改变。这边会在另外一篇博客中解决

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript add event remove event
Apr 07 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 Javascript
js完美解决IE6不支持position:fixed的bug
Apr 24 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
Apr 30 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
Aug 12 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
Dec 26 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
react+ant design实现Table的增、删、改的示例代码
Dec 27 #Javascript
React降级配置及Ant Design配置详解
Dec 27 #Javascript
详解Ant Design of React的安装和使用方法
Dec 27 #Javascript
利用Angular2的Observables实现交互控制的方法
Dec 27 #Javascript
angular 用Observable实现异步调用的方法
Dec 27 #Javascript
详解CommonJS和ES6模块循环加载处理的区别
Dec 26 #Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 #Javascript
You might like
谈谈PHP语法(3)
2006/10/09 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
一个简单的js树形菜单
2011/12/09 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
python通过索引遍历列表的方法
2015/05/04 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
python logging模块的使用
2020/09/07 Python
vivo智能手机官方商城:vivo
2016/09/22 全球购物
植物选择:Botanic Choice
2017/02/15 全球购物
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
环境整治工作方案
2014/05/18 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
情人节单身感言
2015/08/03 职场文书
创业计划书之酒店
2019/08/30 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL