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 Loading功能的简单实现
Nov 29 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
JavaScript实现多重继承的方法分析
Jan 09 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
对类Vue的MVVM前端库的实现代码
Sep 07 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 Javascript
利用 JavaScript 实现并发控制的示例代码
Dec 31 Javascript
vue 计算属性和侦听器的使用小结
Jan 25 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
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
Python中Proxypool库的安装与配置
2018/10/19 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python3实现二叉树的最大深度
2019/09/30 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
python语言中有算法吗
2020/06/16 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
速比涛英国官网:Speedo英国
2019/07/15 全球购物
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
广告业务员岗位职责
2014/02/06 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
公司年会主持词范文!
2019/05/07 职场文书