Skip to content

Commit 3a53ad0

Browse files
author
Vladimir Enchev
committed
Merge pull request NativeScript#157 from NativeScript/gustures-handlers-context
Gustures handlers context
2 parents d9216ac + 979cc7e commit 3a53ad0

File tree

8 files changed

+41
-26
lines changed

8 files changed

+41
-26
lines changed

apps/tests/xml-declaration/xml-declaration-tests.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,19 @@ export function test_parse_ShouldParseBindingsToEvents() {
165165

166166
export function test_parse_ShouldParseBindingsToGestures() {
167167
var p = <page.Page>builder.parse("<Page><Label tap='{{ myTap }}' /></Page>");
168-
p.bindingContext = {
168+
var context = {
169169
myTap: function (args) {
170170
//
171171
}
172172
};
173+
174+
p.bindingContext = context;
173175
var lbl = <labelModule.Label>p.content;
174176

175-
TKUnit.assert((<any>lbl)._gesturesObserver !== undefined, "Expected result: true.");
177+
var observer = (<any>lbl)._gesturesObserver;
178+
179+
TKUnit.assert(observer !== undefined, "Expected result: true.");
180+
TKUnit.assert(observer._context === context, "Context should be equal to binding context. Actual result: " + observer._context);
176181
};
177182

178183
export function test_parse_ShouldParseSubProperties() {

ui/builder/component-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ function attachGestureBinding(instance: view.View, gestureName: string, value: s
194194
var handler = instance.bindingContext && instance.bindingContext[getBindingExpressionFromAttribute(value)];
195195
// Check if the handler is function and add it to the instance for specified event name.
196196
if (types.isFunction(handler)) {
197-
instance.observe(gestures.fromString(gestureName.toLowerCase()), handler);
197+
instance.observe(gestures.fromString(gestureName.toLowerCase()), handler, instance.bindingContext);
198198
}
199199
instance.off(observable.Observable.propertyChangeEvent, propertyChangeHandler);
200200
}

ui/core/view-common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ export class View extends proxy.ProxyObject implements definition.View {
147147
this._visualState = visualStateConstants.Normal;
148148
}
149149

150-
observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver {
151-
this._gesturesObserver = gestures.observe(this, type, callback);
150+
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver {
151+
this._gesturesObserver = gestures.observe(this, type, callback, thisArg);
152152
return this._gesturesObserver;
153153
}
154154

ui/core/view.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ declare module "ui/core/view" {
355355
*/
356356
public focus(): boolean;
357357

358-
observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver;
358+
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver;
359359

360360
/**
361361
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).

ui/gestures/gestures-common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export enum SwipeDirection {
2828
down = 1 << 3
2929
}
3030

31-
export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void): definition.GesturesObserver {
31+
export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void, thisArg?: any): definition.GesturesObserver {
3232
var observer = new definition.GesturesObserver(callback);
33-
observer.observe(target, type);
33+
observer.observe(target, type, thisArg);
3434
return observer;
3535
}
3636

ui/gestures/gestures.android.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var SWIPE_VELOCITY_THRESHOLD = 100;
1414
export class GesturesObserver implements definition.GesturesObserver {
1515
private _callback: (args: definition.GestureEventData) => void;
1616
private _target: view.View;
17+
private _context: any;
1718

1819
private _onTouchListener: android.view.View.OnTouchListener;
1920
public _simpleGestureDetector: android.view.GestureDetector;
@@ -32,17 +33,18 @@ export class GesturesObserver implements definition.GesturesObserver {
3233
return this._callback;
3334
}
3435

35-
public observe(target: view.View, type: definition.GestureTypes) {
36+
public observe(target: view.View, type: definition.GestureTypes, thisArg?: any) {
3637
if (target) {
3738
this._target = target;
38-
this._onTargetLoaded = args => {
39+
this._context = thisArg;
40+
this._onTargetLoaded = args => {
3941
trace.write(this._target + ".target loaded. android:" + this._target.android, "gestures");
40-
this._attach(target, type);
42+
this._attach(target, type);
4143
};
42-
this._onTargetUnloaded = args => {
44+
this._onTargetUnloaded = args => {
4345
trace.write(this._target + ".target unloaded. android:" + this._target.android, "gestures");
4446
this._dettach();
45-
};
47+
};
4648

4749
target.on(view.View.loadedEvent, this._onTargetLoaded);
4850
target.on(view.View.unloadedEvent, this._onTargetUnloaded);
@@ -140,7 +142,7 @@ export class GesturesObserver implements definition.GesturesObserver {
140142

141143
var observer = that.get();
142144
if (observer && observer.callback) {
143-
observer.callback(args);
145+
observer.callback.call(observer._context, args);
144146
}
145147

146148
}
@@ -184,7 +186,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
184186

185187
function _executeCallback(observer: GesturesObserver, args: definition.GestureEventData) {
186188
if (observer && observer.callback) {
187-
observer.callback(args);
189+
observer.callback.call((<any>observer)._context, args);
188190
}
189191
}
190192

ui/gestures/gestures.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ declare module "ui/gestures" {
126126
* @param target - View which will be watched for originating a specific gesture.
127127
* @param type - Type of the gesture.
128128
*/
129-
observe(target: view.View, type: GestureTypes);
129+
observe(target: view.View, type: GestureTypes, thisArg?: any);
130130

131131
/**
132132
* Disconnects the gesture observer.
@@ -140,7 +140,7 @@ declare module "ui/gestures" {
140140
* @param type - Type of the gesture.
141141
* @param callback - A function that will be executed when a gesture is received.
142142
*/
143-
export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void): GesturesObserver;
143+
export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): GesturesObserver;
144144

145145
/**
146146
* Returns a string representation of a gesture type.

ui/gestures/gestures.ios.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,20 @@ class UIGestureRecognizerImpl extends NSObject {
1616
private _owner: GesturesObserver;
1717
private _type: any;
1818
private _callback: Function;
19+
private _context: any;
1920

20-
public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function): UIGestureRecognizerImpl {
21+
public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function, thisArg?: any): UIGestureRecognizerImpl {
2122
this._owner = owner;
2223
this._type = type;
24+
2325
if (callback) {
2426
this._callback = callback;
2527
}
2628

29+
if (thisArg) {
30+
this._context = thisArg;
31+
}
32+
2733
return this;
2834
}
2935

@@ -44,7 +50,7 @@ class UIGestureRecognizerImpl extends NSObject {
4450
};
4551

4652
if (callback) {
47-
callback(args);
53+
callback.call(this._context, args);
4854
}
4955
}
5056
}
@@ -53,6 +59,7 @@ export class GesturesObserver implements definition.GesturesObserver {
5359
public _callback: (args: definition.GestureEventData) => void;
5460
public _target: view.View;
5561
private _recognizers: {};
62+
private _context: any;
5663

5764
private _onTargetLoaded: (data: observable.EventData) => void;
5865
private _onTargetUnloaded: (data: observable.EventData) => void;
@@ -62,9 +69,10 @@ export class GesturesObserver implements definition.GesturesObserver {
6269
this._recognizers = {};
6370
}
6471

65-
public observe(target: view.View, type: definition.GestureTypes) {
72+
public observe(target: view.View, type: definition.GestureTypes, thisArg?: any) {
6673
if (target) {
6774
this._target = target;
75+
this._context = thisArg;
6876
this._onTargetLoaded = args => {
6977
trace.write(this._target + ".target loaded. _nativeView:" + this._target._nativeView, "gestures");
7078
this._attach(target, type);
@@ -84,7 +92,7 @@ export class GesturesObserver implements definition.GesturesObserver {
8492

8593
}
8694

87-
private _attach(target: view.View, type: definition.GestureTypes) {
95+
private _attach(target: view.View, type: definition.GestureTypes) {
8896
trace.write(target + "._attach() _nativeView:" + target._nativeView, "gestures");
8997
this._dettach();
9098

@@ -175,14 +183,14 @@ export class GesturesObserver implements definition.GesturesObserver {
175183

176184
private _executeCallback(args: definition.GestureEventData) {
177185
if (this._callback) {
178-
this._callback(args);
186+
this._callback.call(this._context, args);
179187
}
180188
}
181189

182190
private _createRecognizer(type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, swipeDirection?: UISwipeGestureRecognizerDirection): UIGestureRecognizer {
183191
var recognizer: UIGestureRecognizer;
184192
var name = definition.toString(type);
185-
var target = _createUIGestureRecognizerTarget(this, type, callback);
193+
var target = _createUIGestureRecognizerTarget(this, type, callback, this._context);
186194
var recognizerType = _getUIGestureRecognizerType(type);
187195

188196
if (recognizerType) {
@@ -194,7 +202,7 @@ export class GesturesObserver implements definition.GesturesObserver {
194202
else {
195203
recognizer = recognizerType.alloc().initWithTargetAction(target, "recognize");
196204
}
197-
205+
198206
if (recognizer) {
199207
this._recognizers[name] = <RecognizerCache>{ recognizer: recognizer, target: target };
200208
}
@@ -204,8 +212,8 @@ export class GesturesObserver implements definition.GesturesObserver {
204212
}
205213
}
206214

207-
function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void): any {
208-
return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback);
215+
function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, thisArg?: any): any {
216+
return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback, thisArg);
209217
}
210218

211219
interface RecognizerCache {

0 commit comments

Comments
 (0)