Skip to content
This repository was archived by the owner on Apr 30, 2018. It is now read-only.

Commit 6cd15e1

Browse files
author
Kent C. Dodds
committed
Merge pull request #639 from kwypchlo/fix-relative-model-in-expressions
fix relative string models in hideExpression and watchers
2 parents e993e14 + c899ee6 commit 6cd15e1

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/directives/formly-form.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
4242
${getHideDirective()}="!field.hide"
4343
class="formly-field"
4444
options="field"
45-
model="field.model || model"
45+
model="field.model"
4646
original-model="model"
4747
fields="fields"
4848
form="theFormlyForm"
@@ -275,6 +275,8 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
275275

276276
isNewModel = !referencesCurrentlyWatchedModel(expression)
277277

278+
// temporary assign $scope.model as field.model to evaluate the expression in correct context
279+
field.model = $scope.model
278280
field.model = evalCloseToFormlyExpression(expression, undefined, field, index)
279281
if (!field.model) {
280282
throw formlyUsability.getFieldError(
@@ -283,6 +285,8 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
283285
' expression must have been initialized ahead of time.',
284286
field)
285287
}
288+
} else if (!field.model) {
289+
field.model = $scope.model
286290
}
287291
return isNewModel
288292
}
@@ -338,6 +342,8 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
338342
return originalExpression(...args)
339343
}
340344
watchExpression.displayName = `Formly Watch Expression for field for ${field.key}`
345+
} else if (field.model) {
346+
watchExpression = $parse(watchExpression).bind(null, $scope, {model: field.model})
341347
}
342348
return watchExpression
343349
}
@@ -376,6 +382,7 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol
376382
function getFormlyFieldLikeLocals(field, index) {
377383
// this makes it closer to what a regular formlyExpression would be
378384
return {
385+
model: field.model,
379386
options: field,
380387
index,
381388
formState: $scope.options.formState,

src/directives/formly-form.test.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,17 +597,21 @@ describe('formly-form', () => {
597597
})
598598

599599
it('ensures that hideExpression has all the expressionProperties values', () => {
600+
scope.model = {nested: {foo: 'bar', baz: []}}
600601
scope.options = {formState: {}}
601602
scope.fields = [{
602603
template: input,
603604
key: 'test',
605+
model: 'model.nested',
604606
hideExpression: `
607+
model === options.data.model &&
605608
options === options.data.field &&
606609
index === 0 &&
607610
formState === options.data.formOptions.formState &&
608611
originalModel === options.data.originalModel &&
609612
formOptions === options.data.formOptions`,
610613
data: {
614+
model: scope.model.nested,
611615
originalModel: scope.model,
612616
formOptions: scope.options,
613617
},
@@ -1196,7 +1200,7 @@ describe('formly-form', () => {
11961200
}
11971201
scope.fields[0].model = model
11981202
scope.fields[0].watcher = [{
1199-
expression: 'model.nested.foo',
1203+
expression: 'model.foo',
12001204
runFieldExpressions: true,
12011205
}]
12021206
scope.fields[0].expressionProperties = {
@@ -1363,7 +1367,7 @@ describe('formly-form', () => {
13631367
const field = scope.fields[0]
13641368

13651369
field.model = 'model.baz'
1366-
field.hideExpression = 'model.baz.buzz === "bar"'
1370+
field.hideExpression = 'model.buzz === "bar"'
13671371

13681372
compileAndDigest()
13691373
$timeout.flush()

0 commit comments

Comments
 (0)