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 相关文章推荐
jqeury eval将字符串转换json的方法
Jan 20 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
javascript创建createXmlHttpRequest对象示例代码
Feb 10 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
jQuery的框架介绍
May 11 Javascript
javaScript语法总结
Nov 25 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
Jan 20 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
Jul 10 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 Javascript
js中console在一行内打印字符串和对象的方法
Sep 10 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中的实现trim函数代码
2007/03/19 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
搭建vue开发环境
2018/07/19 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
一份创业计划书范文
2014/02/08 职场文书
司机检讨书
2014/02/13 职场文书
洗发露广告词
2014/03/14 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
人大调研汇报材料
2014/08/14 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书