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模块化和命名空间管理的问题说明
Dec 06 Javascript
Script的加载方法小结
Jan 12 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
基于JQuery的多标签实现代码
Sep 19 Javascript
JavaScript获得url查询参数的方法
Jul 02 Javascript
基于node实现websocket协议
Apr 25 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
AngularJS 指令详细介绍
Jul 27 Javascript
jQuery双向列表选择器select版
Nov 01 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
基于Require.js使用方法(总结)
Oct 26 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 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
Terran历史背景
2020/03/14 星际争霸
解析PHP中ob_start()函数的用法
2013/06/24 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
python的json包位置及用法总结
2020/06/21 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
德国PC硬件网站:CASEKING
2016/10/20 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
房地产财务部员工岗位职责
2014/03/12 职场文书
党支部换届选举方案
2014/05/08 职场文书
减负增效提质方案
2014/05/23 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
2015年统战工作总结
2015/05/19 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
golang操作rocketmq的示例代码
2022/04/06 Golang