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

 更新时间:2020年04月21日 14:33:15   投稿:mrr  
这篇文章主要介绍了angular 中使用原生拖拽页面卡顿及表单控件输入延迟问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

说明

之前有一个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 中使用原生拖拽页面卡顿,表单控件输入延迟内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Angular中点击li标签实现更改颜色的核心代码

    Angular中点击li标签实现更改颜色的核心代码

    这篇文章主要介绍了Angular中点击li标签实现更改颜色的核心代码,需要的朋友可以参考下
    2017-12-12
  • Angular懒加载机制刷新后无法回退的快速解决方法

    Angular懒加载机制刷新后无法回退的快速解决方法

    使用oclazyload懒加载angular的模块,刷新页面后,单击回退按钮无法返回上一个页面.怎么回事呢?下面小编给大家带来了angular懒加载机制刷新后无法回退的快速解决方法,非常不错,感兴趣的朋友参考下
    2016-08-08
  • AngularJS基础 ng-cloak 指令简单示例

    AngularJS基础 ng-cloak 指令简单示例

    本文主要介绍AngularJS ng-cloak 指令,这里帮大家整理了ng-clock指令的基础资料,和简单的代码实例及效果图,学习AngularJS指令的朋友可以参考下
    2016-08-08
  • AngularJS实现的自定义过滤器简单示例

    AngularJS实现的自定义过滤器简单示例

    这篇文章主要介绍了AngularJS实现的自定义过滤器,结合实例形式分析了AngularJS自定义过滤器的简单定义与使用操作技巧,需要的朋友可以参考下
    2019-02-02
  • AngularJS过滤器filter用法总结

    AngularJS过滤器filter用法总结

    这篇文章主要介绍了AngularJS过滤器filter用法,结合实例形式较为详细的总结分析了过滤器filter的功能、分类、使用技巧及自定义过滤器的实现方法,需要的朋友可以参考下
    2016-12-12
  • angular4笔记系列之内置指令小结

    angular4笔记系列之内置指令小结

    这篇文章主要介绍了angular4笔记系列之内置指令小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • AngularJS实现表单验证

    AngularJS实现表单验证

    客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。在AngularJS中,有许多表单验证指令。在这里,我们将谈谈几个最流行指令,然后我们将讨论如何编写自定义的验证。
    2015-01-01
  • 详谈Angular路由与Nodejs路由的区别

    详谈Angular路由与Nodejs路由的区别

    下面小编就为大家带来一篇详谈Angular路由与Nodejs路由的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • AngularJS基础 ng-repeat 指令简单示例

    AngularJS基础 ng-repeat 指令简单示例

    本文主要讲解AngularJS ng-repeat 指令,这里对ng-repeat的基础资料做了整理,并附有示例代码,有兴趣的朋友可以参考下
    2016-08-08
  • angular 实现同步验证器跨字段验证的方法

    angular 实现同步验证器跨字段验证的方法

    几乎每个web应用都会用到表单,那么验证器就是必不可少的东西,这篇文章主要介绍了angular 实现同步验证器跨字段验证的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论