回避策を見つけました:
TouchEvents は実際には DOM の削除後も発生し続けますが、オリジナルが発生したノード/要素のみを対象としており、touchstart
バブルしません (MouseEvents とは異なり、混乱します!)。
そのため、簡単に実行でき@HostListener('touchmove', ['$event'])
ず、DOM の削除で機能することを期待できません (イベント リスナーが外側のコンポーネント要素に関連付けられているため)。touchstartイベントのターゲット要素が発生すると、イベント リスナーを動的に追加する必要があります。次に、または(または) に対してクリーンアップを実行します。touchend
touchcancel
ngOnDestroy()
ソルン:
@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