mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Fixed issue #814.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
2
ui/builder/binding-builder.d.ts
vendored
2
ui/builder/binding-builder.d.ts
vendored
@@ -13,4 +13,6 @@ declare module "ui/builder/binding-builder" {
|
||||
}
|
||||
|
||||
export function getBindingOptions(name: string, value: string): any;
|
||||
|
||||
export var parentsRegex: RegExp;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user