Skip to content

Commit d7c9256

Browse files
author
Matt Lewis
committed
perf: run all event listeners outside of angulars zone
1 parent bebd925 commit d7c9256

File tree

2 files changed

+59
-30
lines changed

2 files changed

+59
-30
lines changed

src/draggable.directive.ts

+41-20
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
Output,
88
EventEmitter,
99
Input,
10-
OnDestroy
10+
OnDestroy,
11+
NgZone
1112
} from '@angular/core';
1213
import {Subject} from 'rxjs/Subject';
1314
import {Observable} from 'rxjs/Observable';
@@ -72,15 +73,23 @@ export class Draggable implements OnInit, OnDestroy {
7273
/**
7374
* @hidden
7475
*/
75-
constructor(public element: ElementRef, private renderer: Renderer, private draggableHelper: DraggableHelper) {}
76+
constructor(
77+
public element: ElementRef,
78+
private renderer: Renderer,
79+
private draggableHelper: DraggableHelper,
80+
private zone: NgZone
81+
) {}
7682

7783
ngOnInit(): void {
7884

7985
const mouseDrag: Observable<any> = this.mouseDown
8086
.filter(() => this.canDrag())
8187
.flatMap((mouseDownEvent: MouseEvent) => {
8288

83-
this.dragStart.next({x: 0, y: 0});
89+
this.zone.run(() => {
90+
this.dragStart.next({x: 0, y: 0});
91+
});
92+
8493
this.setCursor(MOVE_CURSOR);
8594

8695
const currentDrag: Subject<any> = new Subject();
@@ -129,7 +138,9 @@ export class Draggable implements OnInit, OnDestroy {
129138
.takeUntil(Observable.merge(this.mouseUp, this.mouseDown));
130139

131140
mouseMove.takeLast(1).subscribe(({x, y}) => {
132-
this.dragEnd.next({x, y});
141+
this.zone.run(() => {
142+
this.dragEnd.next({x, y});
143+
});
133144
currentDrag.complete();
134145
this.setCssTransform(null);
135146
if (this.ghostDragEnabled) {
@@ -155,7 +166,9 @@ export class Draggable implements OnInit, OnDestroy {
155166
})
156167
.map(([previous, next]) => next)
157168
.subscribe(({x, y, currentDrag, clientX, clientY}) => {
158-
this.dragging.next({x, y});
169+
this.zone.run(() => {
170+
this.dragging.next({x, y});
171+
});
159172
if (this.ghostDragEnabled) {
160173
this.renderer.setElementStyle(this.element.nativeElement, 'pointerEvents', 'none');
161174
}
@@ -183,42 +196,50 @@ export class Draggable implements OnInit, OnDestroy {
183196
*/
184197
@HostListener('mousedown', ['$event'])
185198
onMouseDown(event: MouseEvent): void {
186-
if (!this.mouseMoveEventListenerUnsubscribe) {
187-
this.mouseMoveEventListenerUnsubscribe = this.renderer.listenGlobal('document', 'mousemove', (event: MouseEvent) => {
188-
this.mouseMove.next(event);
189-
});
190-
}
191-
this.mouseDown.next(event);
199+
this.zone.runOutsideAngular(() => {
200+
if (!this.mouseMoveEventListenerUnsubscribe) {
201+
this.mouseMoveEventListenerUnsubscribe = this.renderer.listenGlobal('document', 'mousemove', (event: MouseEvent) => {
202+
this.mouseMove.next(event);
203+
});
204+
}
205+
this.mouseDown.next(event);
206+
});
192207
}
193208

194209
/**
195210
* @hidden
196211
*/
197212
@HostListener('document:mouseup', ['$event'])
198213
onMouseUp(event: MouseEvent): void {
199-
if (this.mouseMoveEventListenerUnsubscribe) {
200-
this.mouseMoveEventListenerUnsubscribe();
201-
this.mouseMoveEventListenerUnsubscribe = null;
202-
}
203-
this.mouseUp.next(event);
214+
this.zone.runOutsideAngular(() => {
215+
if (this.mouseMoveEventListenerUnsubscribe) {
216+
this.mouseMoveEventListenerUnsubscribe();
217+
this.mouseMoveEventListenerUnsubscribe = null;
218+
}
219+
this.mouseUp.next(event);
220+
});
204221
}
205222

206223
/**
207224
* @hidden
208225
*/
209226
@HostListener('mouseenter')
210227
onMouseEnter(): void {
211-
if (this.canDrag()) {
212-
this.setCursor(MOVE_CURSOR);
213-
}
228+
this.zone.runOutsideAngular(() => {
229+
if (this.canDrag()) {
230+
this.setCursor(MOVE_CURSOR);
231+
}
232+
});
214233
}
215234

216235
/**
217236
* @hidden
218237
*/
219238
@HostListener('mouseleave')
220239
onMouseLeave(): void {
221-
this.setCursor(null);
240+
this.zone.runOutsideAngular(() => {
241+
this.setCursor(null);
242+
});
222243
}
223244

224245
private setCssTransform(value: string): void {

src/droppable.directive.ts

+18-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Directive, OnInit, ElementRef, OnDestroy, Output, EventEmitter} from '@angular/core';
1+
import {Directive, OnInit, ElementRef, OnDestroy, Output, EventEmitter, NgZone} from '@angular/core';
22
import {Subject} from 'rxjs/Subject';
33
import {Subscription} from 'rxjs/Subscription';
44
import {Observable} from 'rxjs/Observable';
@@ -28,7 +28,7 @@ export class Droppable implements OnInit, OnDestroy {
2828

2929
currentDragSubscription: Subscription;
3030

31-
constructor(private element: ElementRef, private draggableHelper: DraggableHelper) {}
31+
constructor(private element: ElementRef, private draggableHelper: DraggableHelper, private zone: NgZone) {}
3232

3333
ngOnInit(): void {
3434

@@ -54,14 +54,18 @@ export class Droppable implements OnInit, OnDestroy {
5454

5555
overlapsChanged.filter(overlapsNow => overlapsNow).subscribe(() => {
5656
dragOverActive = true;
57-
this.dragEnter.next({
58-
dropData: currentDragDropData
57+
this.zone.run(() => {
58+
this.dragEnter.next({
59+
dropData: currentDragDropData
60+
});
5961
});
6062
});
6163

6264
overlaps.filter(overlapsNow => overlapsNow).subscribe(() => {
63-
this.dragOver.next({
64-
dropData: currentDragDropData
65+
this.zone.run(() => {
66+
this.dragOver.next({
67+
dropData: currentDragDropData
68+
});
6569
});
6670
});
6771

@@ -70,16 +74,20 @@ export class Droppable implements OnInit, OnDestroy {
7074
.filter(([didOverlap, overlapsNow]) => didOverlap && !overlapsNow)
7175
.subscribe(() => {
7276
dragOverActive = false;
73-
this.dragLeave.next({
74-
dropData: currentDragDropData
77+
this.zone.run(() => {
78+
this.dragLeave.next({
79+
dropData: currentDragDropData
80+
});
7581
});
7682
});
7783

7884
drag.flatMap(() => overlaps).subscribe({
7985
complete: () => {
8086
if (dragOverActive) {
81-
this.drop.next({
82-
dropData: currentDragDropData
87+
this.zone.run(() => {
88+
this.drop.next({
89+
dropData: currentDragDropData
90+
});
8391
});
8492
}
8593
}

0 commit comments

Comments
 (0)