Fixed issue #814.

This commit is contained in:
Nedyalko Nikolov
2015-10-01 16:13:21 +03:00
parent fb24c13331
commit e7156b53bd
7 changed files with 37 additions and 23 deletions

View File

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

View File

@@ -561,7 +561,7 @@ export function test_bindingToParentObject() {
listViewModel.set("parentTestProp", expectedValue);
listView.bindingContext = listViewModel;
listView.bind({ sourceProperty: "items", targetProperty: "items" });
listView.itemTemplate = "<Label id=\"testLabel\" text=\"{{ sourceProperty = $parents[ListView].parentTestProp }}\" />";
listView.itemTemplate = "<Label id=\"testLabel\" text=\"{{ $parents[ListView].parentTestProp }}\" />";
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 = "<Label id=\"testLabel\" text=\"{{ sourceProperty = $parents[ ListView ].parentTestProp }}\" />";
listView.itemTemplate = "<Label id=\"testLabel\" text=\"{{ $parents[ ListView ].parentTestProp }}\" />";
TKUnit.wait(ASYNC);
var firstNativeElementText = getTextFromNativeElementAt(listView, 0);

View File

@@ -2,7 +2,7 @@
<Repeater id="repeater" items="{{ items }}">
<Repeater.itemTemplate>
<GridLayout width="94" height="94" >
<Label text="{{ sourceProperty = $parents['Page'].parentViewProperty }}" tap="{{ tapItem }}" />
<Label text="{{ $parents['Page'].parentViewProperty }}" tap="{{ tapItem }}" />
</GridLayout>
</Repeater.itemTemplate>
</Repeater>

View File

@@ -603,7 +603,7 @@ export function test_parse_ShouldParseNestedListViewInListViewTemplate() {
}
export function test_parse_ShouldEvaluateEventBindingExpressionInListViewTemplate() {
var p = <Page>builder.parse('<Page xmlns="http://www.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><SegmentedBar items="{{ sourceProperty = $parents[\'ListView\'].items }}" selectedIndexChanged="{{ sourceProperty = $parents[\'ListView\'].changed }}" /></ListView.itemTemplate></ListView></Page>');
var p = <Page>builder.parse('<Page xmlns="http://www.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><SegmentedBar items="{{ $parents[\'ListView\'].items }}" selectedIndexChanged="{{ $parents[\'ListView\'].changed }}" /></ListView.itemTemplate></ListView></Page>');
function testAction(views: Array<viewModule.View>) {
var ctrl: segmentedBar.SegmentedBar;

View File

@@ -13,4 +13,6 @@ declare module "ui/builder/binding-builder" {
}
export function getBindingOptions(name: string, value: string): any;
export var parentsRegex: RegExp;
}

View File

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

View File

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