diff --git a/apps/tests/ui/bindable-tests.ts b/apps/tests/ui/bindable-tests.ts
index cec48c3c7..ee15a6df2 100644
--- a/apps/tests/ui/bindable-tests.ts
+++ b/apps/tests/ui/bindable-tests.ts
@@ -400,7 +400,7 @@ export var test_getBindableOptionsFromStringShortFormatExpression = function ()
var bindingExpression = "bindProperty * 2";
var bindOptions = bindingBuilder.getBindingOptions("targetBindProperty", bindingExpression);
- TKUnit.assert(bindOptions.sourceProperty === "bindProperty", "Expected: bindProperty, Actual: " + bindOptions.sourceProperty);
+ TKUnit.assert(bindOptions.sourceProperty === "$value", "Expected: bindProperty, Actual: " + bindOptions.sourceProperty);
TKUnit.assert(bindOptions.targetProperty === "targetBindProperty", "Expected: targetBindProperty, Actual: " + bindOptions.targetProperty);
TKUnit.assert(bindOptions.expression === "bindProperty * 2", "Expected: bindProperty * 2, Actual: " + bindOptions.expression);
TKUnit.assert(bindOptions.twoWay === true, "Expected: true, Actual: " + bindOptions.twoWay);
diff --git a/apps/tests/ui/list-view/list-view-tests.ts b/apps/tests/ui/list-view/list-view-tests.ts
index 3b6db9736..754b4fb23 100644
--- a/apps/tests/ui/list-view/list-view-tests.ts
+++ b/apps/tests/ui/list-view/list-view-tests.ts
@@ -561,7 +561,7 @@ export function test_bindingToParentObject() {
listViewModel.set("parentTestProp", expectedValue);
listView.bindingContext = listViewModel;
listView.bind({ sourceProperty: "items", targetProperty: "items" });
- listView.itemTemplate = "";
+ listView.itemTemplate = "";
TKUnit.wait(ASYNC);
var firstNativeElementText = getTextFromNativeElementAt(listView, 0);
@@ -586,7 +586,7 @@ export function test_bindingToParentObjectWithSpacesInIndexer() {
listViewModel.set("parentTestProp", expectedValue);
listView.bindingContext = listViewModel;
listView.bind({ sourceProperty: "items", targetProperty: "items" });
- listView.itemTemplate = "";
+ listView.itemTemplate = "";
TKUnit.wait(ASYNC);
var firstNativeElementText = getTextFromNativeElementAt(listView, 0);
diff --git a/apps/tests/ui/repeater/repeaterItems-bindingToGestures.xml b/apps/tests/ui/repeater/repeaterItems-bindingToGestures.xml
index 667c672a1..addde5ae1 100644
--- a/apps/tests/ui/repeater/repeaterItems-bindingToGestures.xml
+++ b/apps/tests/ui/repeater/repeaterItems-bindingToGestures.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/apps/tests/xml-declaration/xml-declaration-tests.ts b/apps/tests/xml-declaration/xml-declaration-tests.ts
index 5ab1be618..4083ea09d 100644
--- a/apps/tests/xml-declaration/xml-declaration-tests.ts
+++ b/apps/tests/xml-declaration/xml-declaration-tests.ts
@@ -603,7 +603,7 @@ export function test_parse_ShouldParseNestedListViewInListViewTemplate() {
}
export function test_parse_ShouldEvaluateEventBindingExpressionInListViewTemplate() {
- var p = builder.parse('');
+ var p = builder.parse('');
function testAction(views: Array) {
var ctrl: segmentedBar.SegmentedBar;
diff --git a/ui/builder/binding-builder.d.ts b/ui/builder/binding-builder.d.ts
index 8917ecc1f..47bd7a67a 100644
--- a/ui/builder/binding-builder.d.ts
+++ b/ui/builder/binding-builder.d.ts
@@ -13,4 +13,6 @@ declare module "ui/builder/binding-builder" {
}
export function getBindingOptions(name: string, value: string): any;
+
+ export var parentsRegex: RegExp;
}
diff --git a/ui/builder/binding-builder.ts b/ui/builder/binding-builder.ts
index ee1578d27..8e8afa2b7 100644
--- a/ui/builder/binding-builder.ts
+++ b/ui/builder/binding-builder.ts
@@ -15,6 +15,10 @@ export module bindingConstants {
var hasEqualSignRegex = /=+/;
var equalSignComparisionOperatorsRegex = /(==|===|>=|<=|!=|!==)/;
+
+// this regex is used to search for all instaces of '$parents[]' within an expression
+export var parentsRegex = /\$parents\s*\[\s*(['"]*)\w*\1\s*\]/g;
+
function isNamedParam(value) {
var equalSignIndex = value.search(hasEqualSignRegex);
if (equalSignIndex > -1) {
@@ -80,17 +84,6 @@ function parseNamedProperties(parameterList, knownOptions, callback) {
return result;
}
-function extractPropertyNameFromExpression(expression: string): string {
- var firstExpressionSymbolIndex = expression.search(expressionSymbolsRegex);
- if (firstExpressionSymbolIndex > -1) {
- var sourceProp = expression.substr(0, firstExpressionSymbolIndex).trim();
- return sourceProp;
- }
- else {
- return expression;
- }
-}
-
function getParamsArray(value: string) {
var result = [];
var i;
@@ -126,16 +119,37 @@ function getParamsArray(value: string) {
return result;
}
+function isExpression(expression: string): boolean {
+ if (expression.search(expressionSymbolsRegex) > -1) {
+ var parentsMatches = expression.match(parentsRegex);
+ if (parentsMatches) {
+ var restOfExpression = expression.substr(expression.indexOf(parentsMatches[0]) + parentsMatches[0].length);
+ // no more expression regognition symbols so it is safe for sourceProperty
+ if (!(restOfExpression.search(expressionSymbolsRegex) > -1)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
export function getBindingOptions(name: string, value: string): any {
var namedParams = [];
var params = getParamsArray(value);
if (!areNamedParams(params)) {
if (params.length === 1) {
- namedParams.push(bindingConstants.sourceProperty + " = " + extractPropertyNameFromExpression(params[0].trim()));
- var expression = params[0].search(expressionSymbolsRegex) > -1 ? params[0].trim() : null;
- if (expression) {
- namedParams.push(bindingConstants.expression + " = " + expression);
+ var trimmedValue = params[0].trim();
+ var sourceProp;
+ if (isExpression(trimmedValue)) {
+ sourceProp = bindingConstants.bindingValueKey;
+ namedParams.push(bindingConstants.expression + " = " + trimmedValue);
}
+ else {
+ sourceProp = trimmedValue;
+ }
+ namedParams.push(bindingConstants.sourceProperty + " = " + sourceProp);
+
namedParams.push(bindingConstants.twoWay + " = true");
}
else {
diff --git a/ui/core/bindable.ts b/ui/core/bindable.ts
index 0c4bc3c30..d388581f1 100644
--- a/ui/core/bindable.ts
+++ b/ui/core/bindable.ts
@@ -26,8 +26,6 @@ var contextKey = "context";
// from $parents[1] will return 1
var paramsRegex = /\[\s*(['"])*(\w*)\1\s*\]/;
-// this regex is used to search for all instaces of '$parents[]' within an expression
-var parentsRegex = /\$parents\s*\[\s*(['"]*)\w*\1\s*\]/g;
var bc = bindingBuilder.bindingConstants;
export class Bindable extends dependencyObservable.DependencyObservable implements definition.Bindable {
@@ -424,7 +422,7 @@ export class Binding {
}
}
- var parentsArray = expression.match(parentsRegex);
+ var parentsArray = expression.match(bindingBuilder.parentsRegex);
if (parentsArray) {
var i;
for (i = 0; i < parentsArray.length; i++) {