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一元操作符(递增、递减)使用示例
Aug 07 Javascript
js switch case default 的用法示例介绍
Oct 23 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
第一次接触神奇的Bootstrap
Oct 14 Javascript
Vue数据驱动模拟实现1
Jan 11 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
Sep 21 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
使用react context 实现vue插槽slot功能
Jul 18 Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP的栏目导航程序
2006/10/09 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python多线程实现同步的四种方式
2017/05/02 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
生产总经理岗位职责
2013/12/19 职场文书
全国道德模范事迹
2014/02/01 职场文书
财务总监管理职责范文
2014/03/09 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
交通事故被告答辩状
2015/05/22 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers