From aef7256e69d5924da1747af2994fef9231cc81b0 Mon Sep 17 00:00:00 2001 From: Nedyalko Nikolov Date: Wed, 21 Oct 2015 16:42:37 +0300 Subject: [PATCH] Enabled bindings to events and gestures for Bindable instead of View. --- .../ui/action-bar/action-bar-tests-common.ts | 34 +++++++++++++++++++ ui/core/bindable.ts | 4 ++- ui/core/view-common.ts | 6 ++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/apps/tests/ui/action-bar/action-bar-tests-common.ts b/apps/tests/ui/action-bar/action-bar-tests-common.ts index 5dbf44889..ef1a27e66 100644 --- a/apps/tests/ui/action-bar/action-bar-tests-common.ts +++ b/apps/tests/ui/action-bar/action-bar-tests-common.ts @@ -4,7 +4,9 @@ import helper = require("../helper"); import builder = require("ui/builder"); import button = require("ui/button"); import PageModule = require("ui/page"); +import viewModule = require("ui/core/view"); import fs = require("file-system"); +import { Observable } from "data/observable"; // // # ActionBar @@ -172,6 +174,38 @@ export function test_titleView_inXML_short_definition() { TKUnit.assert(centerBtn instanceof button.Button, "cneterView not loaded correctly"); }; +export function test_ActionBarItemBindingToEvent() { + var p = builder.parse(''); + + var testAction = function (views: Array) { + var page = views[0]; + var firstHandlerCallCounter = 0; + var secondHandlerCallCounter = 0; + var firstHandler = function () { firstHandlerCallCounter++; }; + var secondHandler = function () { secondHandlerCallCounter++; }; + + page.bindingContext = new Observable({ "test": firstHandler }); + + var actionBarItem = page.actionBar.actionItems.getItemAt(0); + + TKUnit.assertEqual((actionBarItem)._observers["tap"].length, 1, "There should be only one listener"); + TKUnit.assertEqual((actionBarItem)._observers["tap"][0].callback + "", "function () { firstHandlerCallCounter++; }", "First handler is not equal"); + + p.bindingContext.set("test", secondHandler); + + TKUnit.assertEqual((actionBarItem)._observers["tap"].length, 1, "There should be only one listener"); + TKUnit.assertEqual((actionBarItem)._observers["tap"][0].callback + "", "function () { secondHandlerCallCounter++; }", "Second handler is not equal"); + } + + helper.navigate(function () { return p; }); + try { + testAction([p]); + } + finally { + helper.goBack(); + } +} + export function test_Setting_ActionItems_doesnt_thrown() { var page: PageModule.Page; diff --git a/ui/core/bindable.ts b/ui/core/bindable.ts index 5c7cd524f..cc595e70d 100644 --- a/ui/core/bindable.ts +++ b/ui/core/bindable.ts @@ -584,9 +584,11 @@ export class Binding { this.updating = true; try { - if (optionsInstance instanceof viewModule.View && + if (optionsInstance instanceof Bindable && viewModule.isEventOrGesture(options.property, optionsInstance) && types.isFunction(value)) { + // calling off method with null as handler will remove all handlers for options.property event + optionsInstance.off(options.property, null, optionsInstance.bindingContext); optionsInstance.on(options.property, value, optionsInstance.bindingContext); } else { if (optionsInstance instanceof observable.Observable) { diff --git a/ui/core/view-common.ts b/ui/core/view-common.ts index 0fd7f6ac3..3acccd42c 100644 --- a/ui/core/view-common.ts +++ b/ui/core/view-common.ts @@ -295,8 +295,10 @@ export class View extends proxy.ProxyObject implements definition.View { private _disconnectGestureObservers(type: gestures.GestureTypes): void { var observers = this.getGestureObservers(type); - for (let i = 0; i < observers.length; i++) { - observers[i].disconnect(); + if (observers) { + for (let i = 0; i < observers.length; i++) { + observers[i].disconnect(); + } } }