5

I have a standard Hammer gestures custom config in my root module:

import { HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';
import { HammerGestureConfig } from '@angular/platform-browser';

export class CustomHammerConfig extends HammerGestureConfig {
    overrides = {
        pan: {
            direction: 6 // this code enables only horizontal direction
        },
        pinch: {
            enable: false
        },
        rotate: {
            enable: false
        }
    };
}

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        //
    ],
    providers: [
        //
        {
            provide: HAMMER_GESTURE_CONFIG,
            useClass: CustomHammerConfig
        }
    ],
    bootstrap: [
        AppComponent
    ]
})

I have a Carousel component which must be able to pan only horizontally, so the vertical pan on Carousel component block will not prevent the whole page scroll in mobile devices.

So, global Hammer gestures config works fine for my Carousel component.

But I have another component — a Gallery component — which pan gestures must be enabled in all directions. I try to configure the Hammer in my Gallery module:

import { CommonModule} from '@angular/common';
import { NgModule } from '@angular/core';

import { HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';
import { HammerGestureConfig } from '@angular/platform-browser';

import { GalleryComponent } from './gallery.component';

class GalleryHammerConfig extends HammerGestureConfig {
    overrides = {
        pan: {
            direction: 31 // this code enables all directions
        }
    };
}

@NgModule({
    imports: [
        CommonModule
    ],
    declarations: [
        GalleryComponent
    ],
    providers: [
        {
            provide: HAMMER_GESTURE_CONFIG,
            useClass: GalleryHammerConfig
        }
    ],
    exports: [
        GalleryComponent
    ]
})

export class GalleryModule {}

But it does not take any effect — Angular understands only root module configured Hammer gestures.

If I remove Hammer gestures config from the root App module and apply it to the Carousel module, so the Carousel has its own custom config and the Gallery also has its own custom config — well, it does not do any effect at all — Angular takes its own default Hammer gestures config and uses it instead of my custom configs.

So, how do I apply different Hammer gestures configs for different components?

2
  • 3
    Can i please know if you were able to find a solution for this? I am currently having same issue. Commented Feb 13, 2018 at 13:58
  • @NagarjunaYendluri the only solution is to import Hammer and HammerManager and create your own config and gesture handlers and link it to some DOM element you need. Think of it as if you use some jQuery plugin — same here.
    – artuska
    Commented Feb 14, 2018 at 14:41

2 Answers 2

2

You could use the @angular/platform-browser built in gestures instead of attempting to override them.

Your carousel component could use the panleft and panright methods, while your gallery app could use the pan method. Even if they're being used at the same time, you will not have a collision.

Here's a stackblitz I put together of the pan gesture, but you can add it on any element like so as long as you are importing hammerjs into your application.

<div (pan)="onpan($event)"></div>

1
  • There's some more information about this on this article on Angular In Depth.
    – Ryan Kara
    Commented Jul 17, 2018 at 14:42
0

That is impossible to use the same gesture directive to do so. But you can create a new gesture directive.

export interface Recognizer {
  new(options?: any): Recognizer;
  recognizeWith(otherRecognizer: Recognizer | string): Recognizer;
}

export interface RecognizerStatic {
  new(options?: any): Recognizer;
}

export class GestureConfig extends HammerGestureConfig {
  private _hammer = typeof window !== 'undefined' ? (window as any).Hammer : null;

  buildHammer(element: HTMLElement): any {
    const mc = new this._hammer(element, this._hammerOptions || undefined);
    const pan = new this._hammer.Pan();
    const panYourWay = this._createRecognizer(pan, {event: 'panYourWay', direction: 31});
    // Add customized gestures to Hammer manager
    mc.add([panYourWay]);
    return mc; 
  }

 /** Creates a new recognizer, without affecting the default recognizers of HammerJS */
  private _createRecognizer(base: Recognizer, options: any, ...inheritances: Recognizer[]) {
    let recognizer = new (base.constructor as RecognizerStatic)(options);

    inheritances.push(base);
    inheritances.forEach(item => recognizer.recognizeWith(item));

    return recognizer;
  }
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.