From 363a44139fa6ed9afe30a18d779610ae3a780675 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Thu, 5 Nov 2015 16:31:43 +0200 Subject: [PATCH] binding to special properties fixed --- .../xml-declaration/xml-declaration-tests.ts | 11 +++++++++++ ui/core/bindable.ts | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apps/tests/xml-declaration/xml-declaration-tests.ts b/apps/tests/xml-declaration/xml-declaration-tests.ts index 148df2c6c..6ebe461a8 100644 --- a/apps/tests/xml-declaration/xml-declaration-tests.ts +++ b/apps/tests/xml-declaration/xml-declaration-tests.ts @@ -455,6 +455,17 @@ export function test_parse_ShouldParseSubProperties() { TKUnit.assert(sw.visibility === "collapsed", "Expected result: collapsed; Actual result: " + sw.visibility + "; type: " + typeof (sw.visibility)); }; +export function test_parse_ShouldParseBindingToSpecialProperty() { + var classProp = "MyClass"; + var p = builder.parse(""); + var obj = new observable.Observable(); + obj.set("myProp", classProp); + p.bindingContext = obj; + + TKUnit.assertEqual(p.content.className, classProp); + TKUnit.assertEqual(p.content._cssClasses.length, 1); +}; + export function test_parse_ShouldParseBindingsWithCommaInsideSingleQuote() { var expected = "Hi,test" var bindingString = "{{ 'Hi,' + myProp }}"; diff --git a/ui/core/bindable.ts b/ui/core/bindable.ts index cc595e70d..da2c31fa2 100644 --- a/ui/core/bindable.ts +++ b/ui/core/bindable.ts @@ -7,6 +7,7 @@ import trace = require("trace"); import polymerExpressions = require("js-libs/polymer-expressions"); import bindingBuilder = require("../builder/binding-builder"); import viewModule = require("ui/core/view"); +import {getSpecialPropertySetter} from "ui/builder/special-properties"; //late import var _appModule = null; @@ -22,7 +23,7 @@ var bindingContextProperty = new dependencyObservable.Property( "bindingContext", "Bindable", new dependencyObservable.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.Inheritable, onBindingContextChanged) - ); +); function onBindingContextChanged(data: dependencyObservable.PropertyChangeData) { var bindable = data.object; @@ -211,8 +212,8 @@ export class Binding { // then split properties either on '.' or '[' var parentsMatches = property.match(bindingBuilder.parentsRegex); result = property.replace(bindingBuilder.parentsRegex, "parentsMatch") - .replace(/\]/g, "") - .split(/\.|\[/); + .replace(/\]/g, "") + .split(/\.|\[/); var i; var resultLength = result.length; @@ -591,10 +592,15 @@ export class Binding { optionsInstance.off(options.property, null, optionsInstance.bindingContext); optionsInstance.on(options.property, value, optionsInstance.bindingContext); } else { - if (optionsInstance instanceof observable.Observable) { - optionsInstance.set(options.property, value); + let specialSetter = getSpecialPropertySetter(options.property); + if (specialSetter) { + specialSetter(optionsInstance, value); } else { - optionsInstance[options.property] = value; + if (optionsInstance instanceof observable.Observable) { + optionsInstance.set(options.property, value); + } else { + optionsInstance[options.property] = value; + } } } }