diff --git a/ui/builder/component-builder.ts b/ui/builder/component-builder.ts index eb2a22d01..ee1672cf6 100644 --- a/ui/builder/component-builder.ts +++ b/ui/builder/component-builder.ts @@ -194,7 +194,7 @@ function attachGestureBinding(instance: view.View, gestureName: string, value: s var handler = instance.bindingContext && instance.bindingContext[getBindingExpressionFromAttribute(value)]; // Check if the handler is function and add it to the instance for specified event name. if (types.isFunction(handler)) { - instance.observe(gestures.fromString(gestureName.toLowerCase()), handler); + instance.observe(gestures.fromString(gestureName.toLowerCase()), handler, instance.bindingContext); } instance.off(observable.Observable.propertyChangeEvent, propertyChangeHandler); } diff --git a/ui/core/view-common.ts b/ui/core/view-common.ts index 87d1a90dd..a67d2d027 100644 --- a/ui/core/view-common.ts +++ b/ui/core/view-common.ts @@ -147,8 +147,8 @@ export class View extends proxy.ProxyObject implements definition.View { this._visualState = visualStateConstants.Normal; } - observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver { - this._gesturesObserver = gestures.observe(this, type, callback); + observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver { + this._gesturesObserver = gestures.observe(this, type, callback, thisArg); return this._gesturesObserver; } diff --git a/ui/core/view.d.ts b/ui/core/view.d.ts index bbe9232c4..f981f3cf1 100644 --- a/ui/core/view.d.ts +++ b/ui/core/view.d.ts @@ -355,7 +355,7 @@ declare module "ui/core/view" { */ public focus(): boolean; - observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver; + observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver; /** * A basic method signature to hook an event listener (shortcut alias to the addEventListener method). diff --git a/ui/gestures/gestures-common.ts b/ui/gestures/gestures-common.ts index 62eec6113..4ace2eea1 100644 --- a/ui/gestures/gestures-common.ts +++ b/ui/gestures/gestures-common.ts @@ -28,9 +28,9 @@ export enum SwipeDirection { down = 1 << 3 } -export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void): definition.GesturesObserver { +export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void, thisArg?: any): definition.GesturesObserver { var observer = new definition.GesturesObserver(callback); - observer.observe(target, type); + observer.observe(target, type, thisArg); return observer; } diff --git a/ui/gestures/gestures.d.ts b/ui/gestures/gestures.d.ts index ea50afb8b..c8d6fa0b7 100644 --- a/ui/gestures/gestures.d.ts +++ b/ui/gestures/gestures.d.ts @@ -126,7 +126,7 @@ declare module "ui/gestures" { * @param target - View which will be watched for originating a specific gesture. * @param type - Type of the gesture. */ - observe(target: view.View, type: GestureTypes); + observe(target: view.View, type: GestureTypes, thisArg?: any); /** * Disconnects the gesture observer. @@ -140,7 +140,7 @@ declare module "ui/gestures" { * @param type - Type of the gesture. * @param callback - A function that will be executed when a gesture is received. */ - export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void): GesturesObserver; + export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): GesturesObserver; /** * Returns a string representation of a gesture type. diff --git a/ui/gestures/gestures.ios.ts b/ui/gestures/gestures.ios.ts index ca4b7a872..d867c28c8 100644 --- a/ui/gestures/gestures.ios.ts +++ b/ui/gestures/gestures.ios.ts @@ -16,14 +16,20 @@ class UIGestureRecognizerImpl extends NSObject { private _owner: GesturesObserver; private _type: any; private _callback: Function; + private _context: any; - public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function): UIGestureRecognizerImpl { + public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function, thisArg?: any): UIGestureRecognizerImpl { this._owner = owner; this._type = type; + if (callback) { this._callback = callback; } + if (thisArg) { + this._context = thisArg; + } + return this; } @@ -44,7 +50,7 @@ class UIGestureRecognizerImpl extends NSObject { }; if (callback) { - callback(args); + callback.call(this._context, args); } } } @@ -53,6 +59,7 @@ export class GesturesObserver implements definition.GesturesObserver { public _callback: (args: definition.GestureEventData) => void; public _target: view.View; private _recognizers: {}; + private _context: any; private _onTargetLoaded: (data: observable.EventData) => void; private _onTargetUnloaded: (data: observable.EventData) => void; @@ -62,9 +69,10 @@ export class GesturesObserver implements definition.GesturesObserver { this._recognizers = {}; } - public observe(target: view.View, type: definition.GestureTypes) { + public observe(target: view.View, type: definition.GestureTypes, thisArg?: any) { if (target) { this._target = target; + this._context = thisArg; this._onTargetLoaded = args => { trace.write(this._target + ".target loaded. _nativeView:" + this._target._nativeView, "gestures"); this._attach(target, type); @@ -84,7 +92,7 @@ export class GesturesObserver implements definition.GesturesObserver { } - private _attach(target: view.View, type: definition.GestureTypes) { + private _attach(target: view.View, type: definition.GestureTypes) { trace.write(target + "._attach() _nativeView:" + target._nativeView, "gestures"); this._dettach(); @@ -175,14 +183,14 @@ export class GesturesObserver implements definition.GesturesObserver { private _executeCallback(args: definition.GestureEventData) { if (this._callback) { - this._callback(args); + this._callback.call(this._context, args); } } private _createRecognizer(type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, swipeDirection?: UISwipeGestureRecognizerDirection): UIGestureRecognizer { var recognizer: UIGestureRecognizer; var name = definition.toString(type); - var target = _createUIGestureRecognizerTarget(this, type, callback); + var target = _createUIGestureRecognizerTarget(this, type, callback, this._context); var recognizerType = _getUIGestureRecognizerType(type); if (recognizerType) { @@ -194,7 +202,7 @@ export class GesturesObserver implements definition.GesturesObserver { else { recognizer = recognizerType.alloc().initWithTargetAction(target, "recognize"); } - + if (recognizer) { this._recognizers[name] = { recognizer: recognizer, target: target }; } @@ -204,8 +212,8 @@ export class GesturesObserver implements definition.GesturesObserver { } } -function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void): any { - return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback); +function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, thisArg?: any): any { + return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback, thisArg); } interface RecognizerCache {