首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有什么方法可以防止角2 RC5中DOM的去除吗?

有什么方法可以防止角2 RC5中DOM的去除吗?
EN

Stack Overflow用户
提问于 2016-08-04 17:00:47
回答 1查看 408关注 0票数 1

我有角2和触摸设备的问题。特别是,当组件通过NgFor呈现并(触摸)拖动到屏幕上时。如果NgFor的重呈现发生在触摸拖动过程中(由于外部事件更新绑定到NgFor的数据,这在我的应用程序中很常见),就会出现这个问题。touchmove events停止触发,并要求您举起手指再次将其放回原处,这是一种糟糕的移动体验。如果使用鼠标,则不会发生此问题。

本质上,在我的应用程序中,我监听组件上的touchstart事件,通过一个条件*ngIf="isDragging" (它不在NgFor内)显示另一个'DragComponent‘,它是根据touchmove事件位置数据在屏幕上移动的。

我知道为什么会这样。这要归功于Touch Spec的浏览器实现。我通常使用vanilla编写这个问题的代码,方法是将DOM元素保存在内存中,直到touchendtouchcancel事件触发。然而,角现在控制DOM!他们正在删除元素时,它仍然在使用!

看看这个柱塞http://plnkr.co/edit/QR6WDzv6NxOmn6LXTngG?p=preview,更多地了解我想要描述的东西。(注意触摸屏需要,或者使用Chrome DevTools中的触摸仿真)

我还在“角度回购”中创建了一个问题#9864,但没有得到任何响应。我知道他们正忙着为决赛做准备,但在我看来,这应该在决赛之前解决,因为很多用户会在触摸设备上使用角度。

我希望有任何建议/解决办法/黑客。请随时使用解决方案更新柱塞。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-14 17:41:04

找到了一个解决办法:

实际上,TouchEvents在DOM删除之后确实会继续触发,但是它们只针对原始touchstart发生的节点/元素,并且不冒泡(不像MouseEvents,这让人困惑!)

因此,我们不能执行一个简单的@HostListener('touchmove', ['$event']),并期望它与DOM删除一起工作(因为事件侦听器附加到外部组件元素)。我们必须动态,将事件侦听器添加到touchstart事件的目标元素中。然后在touchendtouchcancel (或ngOnDestroy())上执行清理。

索伦:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@HostListener('touchstart', ['$event'])
@HostListener('mousedown', ['$event'])
  dragStart(event) {
    if (event.touches) {    // avoid touch event loss issue
      this.removePreviousTouchListeners();    // avoid mem leaks      
      this.touchmoveListenFunc = this.renderer.listen(event.target, 'touchmove', (e) => { this.onDragMove(e); });
      this.touchendListenFunc = this.renderer.listen(event.target, 'touchend', (e) => { this.removePreviousTouchListeners(); this.onDragEnd(e); });
      this.touchcancelListenFunc = this.renderer.listen(event.target, 'touchcancel', (e) => { this.removePreviousTouchListeners(); this.onDragEnd(e); });
    }
   ...
}

removePreviousTouchListeners() {
    if (this.touchmoveListenFunc !== null)
      this.touchmoveListenFunc();             // remove previous listener
    if (this.touchendListenFunc !== null)
      this.touchendListenFunc();              // remove previous listener
    if (this.touchcancelListenFunc !== null)
      this.touchcancelListenFunc();           // remove previous listener

    this.touchmoveListenFunc = null;
    this.touchendListenFunc = null;
    this.touchcancelListenFunc = null;
  }

 @HostListener('mousemove', ['$event'])
  // @HostListener('touchmove', ['$event'])    // don't declare this, as it is added dynamically
  onDragMove(event) {
    ...   // do stuff with event
  }

@HostListener('mouseup', ['$event'])
  // @HostListener('touchend', ['$event'])     // don't use these as they are added dynamically
  // @HostListener('touchcancel', ['$event']) // don't use these as they are added dynamically
  onDragEnd(event) {
    ...  // do stuff
  }

 ngOnDestroy() {
   this.removePreviousTouchListeners();

不要忘记在构造函数中注入Renderer (从@angular/core导入

https://plus.google.com/+RickByers/posts/GHwpqnAFATf

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38779609

复制
相关文章
Java中抽象类和接口中可以有构造方法吗?
Java中抽象类和接口中可以有构造方法吗? -----------------------------------------------------------------------------
黑泽君
2018/10/11
2.1K0
main方法可以重载吗?可以被其他方法调用吗?可以继承吗?
不过自 JDK1.5 引入动态参数后,String[]数组也可以使用String... args来实现。
4xx.me
2022/06/10
1.6K0
云计算可以弹性伸缩吗?弹性伸缩有什么特点?
在现在的市场中,很多企业都会选择安装云计算系统。互联网在高速发展,云计算的重要性越来越凸显出来。弹性伸缩功能的重要性想必大家也都清楚,我们对云计算的要求越来越高,现在更是希望它能够实现弹性伸缩功能。那么,云计算可以弹性伸缩吗?弹性伸缩有什么特点?针对这两个关键问题,下文会有详细的介绍。
用户8715145
2021/11/02
8.1K0
有什么方法可以快速筛选出 pitch 中的值 在0.2 > x > -0.2 的值?
前几天在Python钻石交流群有个叫【进击的python】的粉丝问了一个Python基础的问题,这里拿出来给大家分享下,一起学习下。
前端皮皮
2022/08/17
1.2K0
有什么方法可以快速筛选出 pitch 中的值 在0.2 > x > -0.2 的值?
为什么索引可以让查询变快,你有思考过吗?
由于是个人凭着自己理解总结的,因此可能不一定精确,但是毋庸置疑的是,在当代,各大公司机构部门的数据都是维护在数据库当中的。数据库作为数据存储介质发展的最新产物,必然是具有许多优点的,其中一个很大的优点就是存储在数据库中的数据访问速度非常快。数据库访问速度快的一个很重要的原因就在于索引index的作用。也就是这篇文章的主要想介绍的内容,为什么索引可以让数据库查询变快?
业余草
2021/12/06
7540
为什么索引可以让查询变快,你有思考过吗?
父类的main方法可以被继承么?有什么特殊?
不过自 JDK1.5 引入动态参数后,String[]数组也可以使用String… args来实现。
Java技术债务
2022/08/09
8470
为什么索引可以让查询变快,你有思考过吗?
由于是个人凭着自己理解总结的,因此可能不一定精确,但是毋庸置疑的是,在当代,各大公司机构部门的数据都是维护在数据库当中的。数据库作为数据存储介质发展的最新产物,必然是具有许多优点的,其中一个很大的优点就是存储在数据库中的数据访问速度非常快。数据库访问速度快的一个很重要的原因就在于索引index的作用。也就是这篇文章的主要想介绍的内容,为什么索引可以让数据库查询变快?
好好学java
2021/07/28
1.7K0
为什么索引可以让查询变快,你有思考过吗?
为什么索引可以让查询变快,你有思考过吗?
由于是个人凭着自己理解总结的,因此可能不一定精确,但是毋庸置疑的是,在当代,各大公司机构部门的数据都是维护在数据库当中的。数据库作为数据存储介质发展的最新产物,必然是具有许多优点的,其中一个很大的优点就是存储在数据库中的数据访问速度非常快。数据库访问速度快的一个很重要的原因就在于索引index的作用。也就是这篇文章的主要想介绍的内容,为什么索引可以让数据库查询变快?
程序猿DD
2021/07/13
9180
为什么索引可以让查询变快,你有思考过吗?
static修饰的函数有什么特点(static可以修饰所有的变量吗)
静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非static)数据成员。
全栈程序员站长
2022/08/02
1.7K0
签完三方后无法去实习,有什么可以弥补的吗?
2023届秋招已经步入尾声,很多小伙伴都已经找到工作&签约三方,慢慢结束了自己的秋招之旅,不过也有一些学弟学妹找到的工作不是很满意,打算在来年春招大干一番。
拓跋阿秀
2023/01/05
7990
为什么正则化可以防止过拟合?
J(w[l],b[l])=1m∑i=1ml(y′,y)+λ2m∑l=1L∣∣w[l]∣∣F2J(w^{[l]}, b^{[l]})= \frac{1}{m}\sum_{i=1}^ml(y^{'},y) + \frac{\lambda}{2m} \sum_{l=1}^L||w^{[l]}||^2_FJ(w[l],b[l])=m1​i=1∑m​l(y′,y)+2mλ​l=1∑L​∣∣w[l]∣∣F2​ F表示Frobenius范数(缩减的L2范数),加上第二项(即正则项)惩罚了权值矩阵使其不能取太大值。
Steve Wang
2019/05/26
1.3K0
DOM对象与jquery对象有什么不同
1.jQuery对象和DOM对象 DOM对象,即是我们用传统的方法(javascript)获得的对象,jQuery对象即是用jQuery类库的选择器获得的对象; var domObj = document.getElementById("id"); //DOM对象 var $obj = $("#id"); //jQuery对象; jQuery对象就是通过jQuery包装DOM对象后产生的对象,它是jQuery独有的。如果一个对象是jQuery对象,那么就可以使用jQuery里的方法,例: $("#foo").html(); //获取id为foo的元素内的html代码,html()是jQuery特有的方法; 上面的那段代码等同于: document.getElementById("foo").innerHTML; 注意:在jQuery对象中无法使用DOM对象的任何方法。 例如$("#id").innerHTML 和$("#id").checked之类的写法都是错误的,可以用$("#id").html()和$("#id").attr ("checked")之类的 jQuery方法来代替。同样,DOM对象也不能使用jQuery方法。学习jQuery开始就应当树立正确的观念,分清jQuery对象和DOM对象之间的区别,之后学习 jQuery就会轻松很多的。
用户5640963
2019/07/28
9490
如何快速掌握一门新技术,有什么独特的学习方法和技巧可以分享吗?
这个话题引起了我的思考和总结,现在的技术这么多,我们该如何高效的学习呢?我先总结一下我所了解的技术和学习的路径。
shigen
2023/09/03
2760
如何快速掌握一门新技术,有什么独特的学习方法和技巧可以分享吗?
DOM的方法
dom树结构
天天_哥
2018/09/29
5160
面试:main 方法可以继承吗?
昨天,微信群里一位网友,在群里发了自己面试的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是:Java 中的 main 方法可以继承吗?
Java旅途
2022/03/04
7070
OpenCV中检测ChArUco的角点(2)
ArUCo标记板是非常有用的,因为他们的快速检测和多功能性。然而,ArUco标记的一个问题是,即使在应用亚像素细化后,其角点位置的精度也不太高。相反,棋盘图案的角点可以更精确地细化,因为每个角点被两个黑色正方形包围。然而,寻找棋盘图案并不像寻找aruco棋盘那样通用:它必须是完全可见的,并且不允许遮挡。
点云PCL博主
2022/02/10
2.9K0
OpenCV中检测ChArUco的角点(2)
React篇(039)-Shadow DOM 和 Virtual DOM 之间有什么区别?
Shadow DOM 是一种浏览器技术,它解决了构建网络应用的脆弱性问题。Shadow DOM 修复了 CSS 和 DOM。它在网络平台中引入作用域样式。无需工具或命名约定,你即可使用原生 JavaScript 捆绑 CSS 和标记、隐藏实现详情以及编写独立的组件。Virtual DOM 是一个由 JavaScript 库在浏览器 API 之上实现的概念。
齐丶先丶森
2022/05/12
4320
Vue:Vue中操作DOM方法
jQuery的杰出的DOM操作能力相信已经深入每一个前端Coder,在使用Vue之前我并不能习惯数据驱动的概念,仍然幻想着把jQuery引入到Vue中,直到深入使用Vue以后才发现,原来许多jQ操作DOM的方法都不需要,数据驱动比手工操作DOM方便快捷许多。尽管如此,Vue仍然给了我们原生DOM控制的能力。 环境是由Vue-Cli搭建的webpack模板,省略CSS部分 HTML部分 <div id="app"> <div class="box-wrapper" > <div clas
MrTreasure
2018/05/10
3.3K0
什么是内存泄漏?防止内存泄露的方法?
动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏。
kdyonly
2023/03/03
1K0
Java的Thread 类中 yield 方法有什么作用?
Java中的Thread类是实现多线程编程的关键基础。在Java中,yield()方法是其中一个用于控制线性“执行/被执行”的指令之一。当调用yield()方法时,当前线程将放弃当前抢占到的CPU资源,并让其他具有相同优先级的线程运行。
用户1289394
2023/08/22
5120
Java的Thread 类中 yield 方法有什么作用?

相似问题

有什么方法可以去除ImageButtons中的灰色背景吗?

11128

有什么方法可以节省JavaScript DOM操作吗?

50

有什么方法可以避免使用角的主机元素使DOM膨胀吗?

18

有什么方法可以去除我的selenium测试的薄片吗?

13

有什么简单的方法可以防止寡妇吗?(第2部)

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文