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 相关文章推荐
JS的数组的扩展实例代码
Jul 09 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
jQuery学习之prop和attr的区别示例介绍
Nov 15 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
Javascript仿PHP $_GET获取URL中的参数
May 12 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
JavaScript中各数制转换全面总结
Aug 21 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
vue把输入框的内容添加到页面的实例讲解
Nov 11 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
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
PL-880隐藏功能
2021/03/01 无线电
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
javascript计算渐变颜色的实例
2017/09/22 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
详解Python中的Lock和Rlock
2021/01/26 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
2014新年寄语
2014/01/20 职场文书
员工薪酬激励方案
2014/06/13 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书