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 iframe的相互操作浅析
Oct 14 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
Mar 06 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
基于jquery库的tab新形式使用
Nov 16 Javascript
Js 导出table内容到Excel的简单实例
Nov 19 Javascript
使用canvas实现仿新浪微博头像截取上传功能
Sep 02 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
socket.io学习教程之基础介绍(一)
Apr 29 Javascript
JavaScript运行原理分析
Feb 09 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
Sep 29 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
vue中的可拖拽宽度div的实现示例
Apr 08 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
模仿OSO的论坛(二)
2006/10/09 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
netbeans7安装python插件的方法图解
2013/12/24 Python
python变量不能以数字打头详解
2016/07/06 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
环境科学专业研究生求职信
2013/10/02 职场文书
员工培训邀请函
2014/02/02 职场文书
小学六年级学生评语
2014/04/22 职场文书
毕业论文评语大全
2014/04/29 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
Python实现byte转integer
2021/06/03 Python
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电