解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题


Posted in Javascript onApril 21, 2020

说明

之前有一个angular项目,页面上表单不算多,也就一百来个(这个不固定,有的地方多,有的地方少),但是再输入的时候会造成输入延迟,反应不灵敏,对用户体验极其不好。还有一个功能就是拖拽功能(原生,没有使用官方中的拖拽功能),从左边拖到右边区域,拖拽区域少的时候还挺流畅,但一旦有几百上千的时候反应极其的慢

原因(?)

上面两个问题其实都和angular的机制有关。一个双向绑定一个拖拽归根结底都是因为angular的变化检测

angular的双向绑定主要是脏数据检查,如果大量的检查,效率比较低。(双向绑定时向zone挂载一个异步函数,对数据改变是做处理,及时将变化反馈显示在页面上)可能就会输入延迟

拖拽(也是向zone挂载异步函数)则是因为angular对每个可移动像素的元素进行检测而且还可能涉及对dom的操作,当拖拽区域数量较为多时,绑定的函数就越多,angular需要检测的元素区域就越来越多,处理起来就越力不从心(即使元素隐藏也不代表不会进行变化检测)

解决

  1. 对于双向绑定造成的输入延迟,停止使用双向绑定,改用单向绑定
  2. 拖拽过程angular一直检测页面变化,所以页面卡顿。我们需要做的就是设置对某些操作不跟踪变化
this.ngZone.runOutsideAngular(() => {
  this.dragEnter = this.rd.listen(spanDom, 'dragenter', this.dragenterHandler.bind(this));
  this.dragOver = this.rd.listen(spanDom, 'dragover', (e) => {
   e.preventDefault();
  });
 this.dragLeave = this.rd.listen(spanDom, 'dragleave', this.dragLeaveHandle.bind(this));
});
this.dragDrop = this.rd.listen(spanDom, 'drop', this.dropHandler.bind(this));

对频繁的操作(如dragover)不去触发变更检测。使用NgZone中的runOutsideAngular方法,angular不会对里面的变化进行跟踪。

ps:下面看下Angular 元素拖拽

  1. 拖动元素到指定区域
  2. 拖放的同时传递数据

1. 安装 ng2-drag-drop

npm install ng2-drag-drop --save

2. 模板中配置可拖拽元素

// drag.component.html
 <div>
  <a href="javascript:;" rel="external nofollow" *ngFor="let item of sysData" draggable [dragData]="item" [dragScope]="'system'">{{ item.name }}</a>
 </div>
  • draggable - 表明此元素时可拖拽的
  • [dragData] = 'item' - 在拖动过程中将item数据从draggable到droppable
  • [dragScope]="'system'" - 拖拽范围,和第三步[dropScope]="'system'"相对应;

3. 模板中配置拖拽元素所拖拽的目的地

// drag.component.ts
 <div droppable (onDrop)="onItemDrop($event)" [dropScope]="'system'"></div>
  • droppable - 第二步中拖拽的元素都将拖拽到有droppable指令的元素内;
  • (onDrop) - 当拖拽元素至此区域内后(鼠标释放后),触发onItemDrop方法,其中$event就是第二步中[dragData] = 'item'的item参数
  • [dropScope]="'system'" - 和第二步的[dragScope]="'system'"对应,[dragScope]="'system'"的拖拽元素只能拖拽到 [dropScope]="'system'"元素内;

4. ts文件

// drag.component.ts
export class DragComponent {

 const sysData = [
  {id: '1', name: '拖动元素1'},
  {id: '2', name: '拖动元素2'},
  {id: '3', name: '拖动元素3'},
  {id: '4', name: '拖动元素4'}
 ];

}

onItemDrop(e: any) {
 // data为拖拽时传递的数据 - item
 const data = e.dragData;
}

总结

到此这篇关于angular 中使用原生拖拽页面卡顿,表单控件输入延迟的文章就介绍到这了,更多相关angular 中使用原生拖拽页面卡顿,表单控件输入延迟内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
基于mootools插件实现遮罩层新手引导
May 24 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
jQuery设置与获取HTML,文本和值的简单实例
Feb 26 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
Bootstrap每天必学之按钮
Nov 26 Javascript
基于javascript bootstrap实现生日日期联动选择
Apr 07 Javascript
javascript 内置对象及常见API详细介绍
Nov 01 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
Feb 28 Javascript
JS简单实现获取元素的封装操作示例
Apr 07 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 #Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 #Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 #Javascript
Vue的全局过滤器和私有过滤器的实现
Apr 20 #Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 #Javascript
vue实现购物车功能(商品分类)
Apr 20 #Javascript
vue实现淘宝购物车功能
Apr 20 #Javascript
You might like
中英文字符串翻转函数
2008/12/09 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
json2.js的初步学习与了解
2011/10/06 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
学习python处理python编码问题
2011/03/13 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
初一地理教学反思
2014/01/16 职场文书
安全教育月活动总结
2014/05/05 职场文书
离婚财产分割协议书
2015/08/11 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript