Merge pull request #157 from NativeScript/gustures-handlers-context

Gustures handlers context
This commit is contained in:
Vladimir Enchev
2015-05-14 09:50:37 +03:00
8 changed files with 41 additions and 26 deletions

View File

@ -165,14 +165,19 @@ export function test_parse_ShouldParseBindingsToEvents() {
export function test_parse_ShouldParseBindingsToGestures() {
var p = <page.Page>builder.parse("<Page><Label tap='{{ myTap }}' /></Page>");
p.bindingContext = {
var context = {
myTap: function (args) {
//
}
};
p.bindingContext = context;
var lbl = <labelModule.Label>p.content;
TKUnit.assert((<any>lbl)._gesturesObserver !== undefined, "Expected result: true.");
var observer = (<any>lbl)._gesturesObserver;
TKUnit.assert(observer !== undefined, "Expected result: true.");
TKUnit.assert(observer._context === context, "Context should be equal to binding context. Actual result: " + observer._context);
};
export function test_parse_ShouldParseSubProperties() {

View File

@ -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);
}

View File

@ -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;
}

2
ui/core/view.d.ts vendored
View File

@ -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).

View File

@ -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;
}

View File

@ -14,6 +14,7 @@ var SWIPE_VELOCITY_THRESHOLD = 100;
export class GesturesObserver implements definition.GesturesObserver {
private _callback: (args: definition.GestureEventData) => void;
private _target: view.View;
private _context: any;
private _onTouchListener: android.view.View.OnTouchListener;
public _simpleGestureDetector: android.view.GestureDetector;
@ -32,9 +33,10 @@ export class GesturesObserver implements definition.GesturesObserver {
return this._callback;
}
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. android:" + this._target.android, "gestures");
this._attach(target, type);
@ -42,7 +44,7 @@ export class GesturesObserver implements definition.GesturesObserver {
this._onTargetUnloaded = args => {
trace.write(this._target + ".target unloaded. android:" + this._target.android, "gestures");
this._dettach();
};
};
target.on(view.View.loadedEvent, this._onTargetLoaded);
target.on(view.View.unloadedEvent, this._onTargetUnloaded);
@ -140,7 +142,7 @@ export class GesturesObserver implements definition.GesturesObserver {
var observer = that.get();
if (observer && observer.callback) {
observer.callback(args);
observer.callback.call(observer._context, args);
}
}
@ -184,7 +186,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
function _executeCallback(observer: GesturesObserver, args: definition.GestureEventData) {
if (observer && observer.callback) {
observer.callback(args);
observer.callback.call((<any>observer)._context, args);
}
}

View File

@ -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.

View File

@ -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);
@ -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) {
@ -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 {