@@ -82,20 +82,23 @@ const expressionParsers = {
82
82
object = getContext ( expression . callee . name , model , changedModel ) ;
83
83
property = expression . callee ?. name ;
84
84
}
85
+
85
86
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
+
86
91
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
+ }
87
95
88
96
const parsedArgs = [ ] ;
89
97
for ( let argument of expression . arguments ) {
90
98
let value = convertExpressionToValue ( argument , model , isBackConvert , changedModel ) ;
91
99
argument . type == 'SpreadElement' ? parsedArgs . push ( ...value ) : parsedArgs . push ( value ) ;
92
100
}
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 ) ;
99
102
} ,
100
103
'ChainExpression' : ( expression : ASTExpression , model , isBackConvert : boolean , changedModel ) => {
101
104
return convertExpressionToValue ( expression . expression , model , isBackConvert , changedModel ) ;
@@ -174,12 +177,16 @@ const expressionParsers = {
174
177
} ;
175
178
176
179
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 ;
178
185
}
179
186
180
- function getConverter ( context , args , isBackConvert : boolean ) {
187
+ function getConverter ( converterSchema , context , args , isBackConvert : boolean ) {
181
188
const converter = { callback : null , context, args } ;
182
- let callback = isBackConvert ? context . toModel : context . toView ;
189
+ let callback = isBackConvert ? converterSchema . toModel : converterSchema . toView ;
183
190
if ( callback == null ) {
184
191
callback = Function . prototype ;
185
192
}
0 commit comments