Skip to content

Commit

Permalink
fix(core): take account of passing observable to model expr (#2096)
Browse files Browse the repository at this point in the history
fix #2094
  • Loading branch information
aitboudad committed Feb 12, 2020
1 parent dad2ef6 commit 4bf1445
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,23 @@ describe('FieldExpressionExtension', () => {
builder.buildForm(form, fields, model, options);
expect(fields[0].templateOptions.label).toEqual('test');
});

it('should change model through observable', () => {
const fields: FormlyFieldConfig[] = [
{
key: 'text',
type: 'input',
expressionProperties: {
'model.text': of('test'),
},
},
];
const model = {};
const options = {};

builder.buildForm(form, fields, model, options);
expect(fields[0].formControl.value).toEqual('test');
});
});
});

Expand Down
47 changes: 24 additions & 23 deletions src/core/src/lib/extensions/field-expression/field-expression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export class FieldExpressionExtension implements FormlyExtension {
} else if (expressionProperty instanceof Observable) {
const subscription = (expressionProperty as Observable<any>)
.subscribe(v => {
evalExpression(expressionValueSetter, { field }, [v, field.model, field]);
this.setExprValue(field, key, expressionValueSetter, v);
if (field.options && field.options._markForCheck) {
field.options._markForCheck(field);
}
Expand Down Expand Up @@ -157,28 +157,8 @@ export class FieldExpressionExtension implements FormlyExtension {
) {
markForCheck = true;
expressionProperties[key].expressionValue = expressionValue;
evalExpression(
expressionProperties[key].expressionValueSetter,
{ field },
[expressionValue, field.model, field],
);

if (key === 'templateOptions.disabled' && field.key) {
this.setDisabledState(field, expressionValue);
}

if (key.indexOf('model.') === 0) {
const path = key.replace(/^model\./, ''),
control = field.key && key === path ? field.formControl : field.parent.formControl.get(path);

if (
control
&& !(isNullOrUndefined(control.value) && isNullOrUndefined(expressionValue))
&& control.value !== expressionValue
) {
control.patchValue(expressionValue, { emitEvent: false });
}
}
const setter = expressionProperties[key].expressionValueSetter;
this.setExprValue(field, key, setter, expressionValue);
}
}

Expand Down Expand Up @@ -241,4 +221,25 @@ export class FieldExpressionExtension implements FormlyExtension {
field.options.fieldChanges.next(<FormlyValueChangeEvent> { field: field, type: 'hidden', value: hide });
}
}

private setExprValue(field: FormlyFieldConfigCache, prop: string, setter: Function, value: any) {
evalExpression(setter, { field }, [value, field.model, field]);

if (prop === 'templateOptions.disabled' && field.key) {
this.setDisabledState(field, value);
}

if (prop.indexOf('model.') === 0) {
const path = prop.replace(/^model\./, ''),
control = field.key && prop === path ? field.formControl : field.parent.formControl.get(path);

if (
control
&& !(isNullOrUndefined(control.value) && isNullOrUndefined(value))
&& control.value !== value
) {
control.patchValue(value, { emitEvent: false });
}
}
}
}

0 comments on commit 4bf1445

Please sign in to comment.