@@ -271,24 +271,31 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
271
271
272
272
if ( angular . isString ( field . model ) ) {
273
273
const expression = field . model
274
- const index = $scope . fields . indexOf ( field )
275
274
276
275
isNewModel = ! referencesCurrentlyWatchedModel ( expression )
277
276
278
- // temporary assign $scope.model as field.model to evaluate the expression in correct context
277
+ field . model = resolveStringModel ( expression )
278
+
279
+ $scope . $watch ( ( ) => resolveStringModel ( expression ) , ( model ) => field . model = model )
280
+ } else if ( ! field . model ) {
279
281
field . model = $scope . model
280
- field . model = evalCloseToFormlyExpression ( expression , undefined , field , index )
281
- if ( ! field . model ) {
282
+ }
283
+ return isNewModel
284
+
285
+ function resolveStringModel ( expression ) {
286
+ const index = $scope . fields . indexOf ( field )
287
+ const model = evalCloseToFormlyExpression ( expression , undefined , field , index , { model : $scope . model } )
288
+
289
+ if ( ! model ) {
282
290
throw formlyUsability . getFieldError (
283
291
'field-model-must-be-initialized' ,
284
292
'Field model must be initialized. When specifying a model as a string for a field, the result of the' +
285
293
' expression must have been initialized ahead of time.' ,
286
294
field )
287
295
}
288
- } else if ( ! field . model ) {
289
- field . model = $scope . model
296
+
297
+ return model
290
298
}
291
- return isNewModel
292
299
}
293
300
294
301
function referencesCurrentlyWatchedModel ( expression ) {
@@ -374,8 +381,8 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
374
381
return [ $scope . fields [ index ] , ...originalArgs , watcher . stopWatching ]
375
382
}
376
383
377
- function evalCloseToFormlyExpression ( expression , val , field , index ) {
378
- const extraLocals = getFormlyFieldLikeLocals ( field , index )
384
+ function evalCloseToFormlyExpression ( expression , val , field , index , extraLocals = { } ) {
385
+ extraLocals = angular . extend ( getFormlyFieldLikeLocals ( field , index ) , extraLocals )
379
386
return formlyUtil . formlyEval ( $scope , expression , val , val , extraLocals )
380
387
}
381
388
0 commit comments