Skip to content

Commit 222914b

Browse files
author
Matt Lewis
committed
fix(draggable): dont fire duplicate dragging events with the same coordinates
Closes #6
1 parent 50d1962 commit 222914b

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

src/draggable.directive.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import 'rxjs/add/observable/merge';
55
import 'rxjs/add/operator/map';
66
import 'rxjs/add/operator/mergeMap';
77
import 'rxjs/add/operator/takeUntil';
8+
import 'rxjs/add/operator/take';
89
import 'rxjs/add/operator/takeLast';
10+
import 'rxjs/add/operator/pairwise';
911
import {DraggableHelper} from './draggableHelper.provider';
1012

1113
export type Coordinates = {x: number, y: number};
@@ -112,11 +114,24 @@ export class Draggable implements OnInit, OnDestroy {
112114
});
113115

114116
mouseDrag.subscribe(({x, y, currentDrag}) => {
115-
this.dragging.next({x, y});
116117
this.setCssTransform(`translate(${x}px, ${y}px)`);
117118
currentDrag.next({rectangle: this.element.nativeElement.getBoundingClientRect(), dropData: this.dropData});
118119
});
119120

121+
Observable.merge(
122+
mouseDrag.take(1).map(value => [, value]),
123+
mouseDrag.pairwise()
124+
).filter(([previous, next]) => {
125+
if (!previous) {
126+
return true;
127+
}
128+
return previous.x !== next.x || previous.y !== next.y;
129+
})
130+
.map(([previous, next]) => next)
131+
.subscribe(({x, y}) => {
132+
this.dragging.next({x, y});
133+
});
134+
120135
}
121136

122137
ngOnDestroy(): void {

test/draggable.directive.spec.ts

+13
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,17 @@ describe('draggable directive', () => {
207207
expect(draggableElement.style.cursor).not.to.be.ok;
208208
});
209209

210+
it('should not call the dragging event multiple times with the same values', () => {
211+
fixture.componentInstance.dragSnapGrid = {y: 10, x: 10};
212+
fixture.detectChanges();
213+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
214+
triggerDomEvent('mousedown', draggableElement, {clientX: 10, clientY: 5});
215+
triggerDomEvent('mousemove', draggableElement, {clientX: 12, clientY: 7});
216+
expect(fixture.componentInstance.dragging).to.have.been.calledOnce;
217+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 0});
218+
triggerDomEvent('mousemove', draggableElement, {clientX: 18, clientY: 14});
219+
expect(fixture.componentInstance.dragging).to.have.been.calledOnce;
220+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 0});
221+
});
222+
210223
});

webpack.config.umd.js

+6
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ module.exports = {
8686
commonjs: 'rxjs/add/operator/filter',
8787
commonjs2: 'rxjs/add/operator/filter',
8888
amd: 'rxjs/add/operator/filter'
89+
},
90+
'rxjs/add/operator/take': {
91+
root: ['rx', 'Observable'],
92+
commonjs: 'rxjs/add/operator/take',
93+
commonjs2: 'rxjs/add/operator/take',
94+
amd: 'rxjs/add/operator/take'
8995
}
9096
},
9197
devtool: 'source-map',

0 commit comments

Comments
 (0)