diff --git a/src/config/providers.ts b/src/config/providers.ts index 4b4ca71f24e..8ea64274c44 100644 --- a/src/config/providers.ts +++ b/src/config/providers.ts @@ -1,6 +1,7 @@ import { enableProdMode, PLATFORM_DIRECTIVES, provide } from '@angular/core'; import { disableDeprecatedForms, provideForms } from '@angular/forms'; import { HTTP_PROVIDERS } from '@angular/http'; +import { HAMMER_GESTURE_CONFIG } from '@angular/platform-browser'; import { ActionSheetController } from '../components/action-sheet/action-sheet'; import { AlertController } from '../components/alert/alert'; @@ -10,6 +11,7 @@ import { closest, nativeTimeout } from '../util/dom'; import { Events } from '../util/events'; import { FeatureDetect } from '../util/feature-detect'; import { Form } from '../util/form'; +import { IonicGestureConfig } from '../gestures/ionic-gesture-config'; import { GestureController } from '../gestures/gesture-controller'; import { IONIC_DIRECTIVES } from './directives'; import { isPresent } from '../util/util'; @@ -81,6 +83,8 @@ export function ionicProviders(customProviders?: Array, config?: any): any[ Translate, ]; + providers.push( {provide: HAMMER_GESTURE_CONFIG, useClass: IonicGestureConfig} ); + if (isPresent(customProviders)) { providers.push(customProviders); } diff --git a/src/gestures/ionic-gesture-config.ts b/src/gestures/ionic-gesture-config.ts new file mode 100644 index 00000000000..f73fc2758c3 --- /dev/null +++ b/src/gestures/ionic-gesture-config.ts @@ -0,0 +1,25 @@ +import {Injectable} from '@angular/core'; +import {HammerGestureConfig} from '@angular/platform-browser'; + +/* this class override the default angular gesture config. + * The motivation for this is enabling pinch, rotate or + * any other multi-touch gestures block scrolling. + */ + +/** + * @private + */ +@Injectable() +export class IonicGestureConfig extends HammerGestureConfig { + + buildHammer(element: HTMLElement) { + var mc = new ( window).Hammer(element); + + for (let eventName in this.overrides) { + mc.get(eventName).set(this.overrides[eventName]); + } + + return mc; + } + +} \ No newline at end of file diff --git a/src/gestures/test/ionic-gesture-config.spec.ts b/src/gestures/test/ionic-gesture-config.spec.ts new file mode 100644 index 00000000000..5c9529b537d --- /dev/null +++ b/src/gestures/test/ionic-gesture-config.spec.ts @@ -0,0 +1,31 @@ +import { IonicGestureConfig } from '../../../src/gestures/ionic-gesture-config'; + +export function run() { + + describe('IonicGestureConfig', () => { + it('should create a new instance of hammer', () => { + // arrange + let instance = new IonicGestureConfig(); + let expectedParam = { name: "expectedParam"}; + let expectedHammerInstance = { name: "hammer"}; + + let actualParam : any = null; + let callCount = 0; + + ( window).Hammer = (param: any) => { + callCount++; + actualParam = param; + return expectedHammerInstance; + }; + + // act + let returnValue = instance.buildHammer( expectedParam); + + // assert + expect(returnValue.name).toEqual(expectedHammerInstance.name); + expect(callCount).toEqual(1); + expect(actualParam.name).toEqual(expectedParam.name); + }); + }) + +} \ No newline at end of file