Skip to content

Commit b4c073f

Browse files
committed
fix(gestures): custom recognizers should not inherit twice.
* HammerJS does not allow custom recognizers to use a default recognizer twice globally. This means that we can't create a `drag` and `slide` recognizer, which depends for all on one default recognizers.
1 parent 14805fe commit b4c073f

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

src/core/gestures/MdGestureConfig.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,32 @@ export class MdGestureConfig extends HammerGestureConfig {
3535
buildHammer(element: HTMLElement) {
3636
var mc = new Hammer(element);
3737

38-
// Create custom gesture recognizers
39-
let drag = this._createRecognizer(Hammer.Pan, {event: 'drag', threshold: 6}, Hammer.Swipe);
40-
let slide = this._createRecognizer(Hammer.Pan, {event: 'slide', threshold: 0}, Hammer.Swipe);
41-
let longpress = this._createRecognizer(Hammer.Press, {event: 'longpress', time: 500});
42-
38+
// Default Hammer Recognizers.
4339
let pan = new Hammer.Pan();
4440
let swipe = new Hammer.Swipe();
41+
let press = new Hammer.Press();
4542

4643
// Overwrite the default `pan` event to use the swipe event.
4744
pan.recognizeWith(swipe);
4845

46+
// Notice that a HammerJS recognizer can only depend on one other recognizer once.
47+
// Otherwise the previous `recognizeWith` will be dropped.
48+
let slide = this._createRecognizer(pan, {event: 'slide', threshold: 0});
49+
let drag = this._createRecognizer(slide, {event: 'drag', threshold: 6});
50+
let longpress = this._createRecognizer(press, {event: 'longpress', time: 500});
51+
4952
// Add customized gestures to Hammer manager
50-
mc.add([drag, slide, pan, longpress]);
53+
mc.add([swipe, press, pan, drag, slide, longpress]);
5154

5255
return mc;
5356
}
5457

5558
/** Creates a new recognizer, without affecting the default recognizers of HammerJS */
56-
private _createRecognizer(type: RecognizerStatic, options: any, ...extra: RecognizerStatic[]) {
57-
let recognizer = new type(options);
59+
private _createRecognizer(base: Recognizer, options: any, ...inheritances: Recognizer[]) {
60+
let recognizer = new (<RecognizerStatic> base.constructor)(options);
5861

59-
// Add the default recognizer to the new custom recognizer.
60-
extra.push(type);
61-
extra.forEach(entry => recognizer.recognizeWith(new entry()));
62+
inheritances.push(base);
63+
inheritances.forEach((item) => recognizer.recognizeWith(item));
6264

6365
return recognizer;
6466
}

0 commit comments

Comments
 (0)