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获取url参数的使用扩展实例
Dec 29 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
ES6中箭头函数的定义与调用方式详解
Jun 02 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
Jul 12 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
JS异步函数队列功能实例分析
Nov 28 Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 Javascript
angular4强制刷新视图的方法
Oct 09 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
vue跳转页面的几种方法(推荐)
Mar 26 Javascript
element多个表单校验的实现
May 27 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
火车头采集器3.0采集图文教程
2007/03/17 PHP
PHP简洁函数小结
2011/08/12 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
js表单验证实例讲解
2016/03/31 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
node内置调试方法总结
2018/02/22 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
python实现网站的模拟登录
2016/01/04 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Django中URL的参数传递的实现
2019/08/04 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Python如何急速下载第三方库详解
2020/11/02 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
家长建议怎么写
2014/05/15 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
管理人员岗位职责
2015/02/14 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
村党组织公开承诺书
2015/04/30 职场文书
培养联系人考察意见
2015/06/01 职场文书
法人身份证明书
2015/06/18 职场文书
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS