8000 feat(bindable): allow "global" context for expressions inside binding… · NativeScript/NativeScript@e19c953 · GitHub
[go: up one dir, main page]

Skip to content

Commit e19c953

Browse files
CatchABusNathanWalker
authored andcommitted
feat(bindable): allow "global" context for expressions inside bindings (#9734)
1 parent 56e9416 commit e19c953

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

packages/core/ui/core/bindable/bindable-expressions.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,23 @@ const expressionParsers = {
8282
object = getContext(expression.callee.name, model, changedModel);
8383
property = expression.callee?.name;
8484
}
85+
8586
const callback = expression.callee.optional ? object?.[property] : object[property];
87+
if (isNullOrUndefined(callback)) {
88+
throw new Error('Cannot perform a call using a null or undefined property');
89+
}
90+
8691
const isConverter = isObject(callback) && (isFunction(callback.toModel) || isFunction(callback.toView));
92+
if (!isFunction(callback) && !isConverter) {
93+
throw new Error('Cannot perform a call using a non-callable property');
94+
}
8795

8896
const parsedArgs = [];
8997
for (let argument of expression.arguments) {
9098
let value = convertExpressionToValue(argument, model, isBackConvert, changedModel);
9199
argument.type == 'SpreadElement' ? parsedArgs.push(...value) : parsedArgs.push(value);
92100
}
93-
94-
if (isNullOrUndefined(callback) || (!isFunction(callback) && !isConverter)) {
95-
throw new Error('Cannot perform a call using a non-function property');
96-
}
97-
98-
return isConverter ? getConverter(callback, parsedArgs, isBackConvert) : callback.apply(object, parsedArgs);
101+
return isConverter ? getConverter(callback, object, parsedArgs, isBackConvert) : callback.apply(object, parsedArgs);
99102
},
100103
'ChainExpression': (expression: ASTExpression, model, isBackConvert: boolean, changedModel) => {
101104
return convertExpressionToValue(expression.expression, model, isBackConvert, changedModel);
@@ -174,12 +177,16 @@ const expressionParsers = {
174177
};
175178

176179
function getContext(key, model, changedModel) {
177-
return key in changedModel ? changedModel : model;
180+
let context = key in changedModel ? changedModel : model;
181+
if (!(key in context)) {
182+
context = global;
183+
}
184+
return context;
178185
}
179186

180-
function getConverter(context, args, isBackConvert: boolean) {
187+
function getConverter(converterSchema, context, args, isBackConvert: boolean) {
181188
const converter = { callback: null, context, args };
182-
let callback = isBackConvert ? context.toModel : context.toView;
189+
let callback = isBackConvert ? converterSchema.toModel : converterSchema.toView;
183190
if (callback == null) {
184191
callback = Function.prototype;
185192
}

0 commit comments

Comments
 (0)
0