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中取绝对值的2种方法
Jul 09 Javascript
输入框过滤非数字的js代码
Sep 18 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
Dec 03 Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
ES6新数据结构Map功能与用法示例
Mar 31 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
vue 请求后台数据的实例代码
Jun 22 Javascript
JavaScript+CSS相册特效实例代码
Sep 07 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
vue-cli webpack配置文件分析
May 20 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php smarty模版引擎中的缓存应用
2009/12/11 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python结合API实现即时天气信息
2016/01/19 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
Python日志器使用方法及原理解析
2020/09/27 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
媒体宣传策划方案
2014/05/25 职场文书
妈妈活动方案
2014/08/15 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript
Django框架中视图的用法
2022/06/10 Python