Skip to content

Commit

Permalink
fix(core): emit statusChanges on updateValueAndValidity (#2107)
Browse files Browse the repository at this point in the history
fix #2106
  • Loading branch information
aitboudad committed Feb 20, 2020
1 parent 80ee85b commit 7deac1a
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { isObject, isNullOrUndefined, isFunction, defineHiddenProp, wrapProperty
import { evalExpression, evalStringExpression, evalExpressionValueSetter } from './utils';
import { Observable } from 'rxjs';
import { FormlyExtension } from '../../services/formly.config';
import { unregisterControl, registerControl } from '../field-form/utils';
import { unregisterControl, registerControl, updateValidity } from '../field-form/utils';

/** @experimental */
export class FieldExpressionExtension implements FormlyExtension {
Expand Down Expand Up @@ -203,7 +203,7 @@ export class FieldExpressionExtension implements FormlyExtension {
defineHiddenProp(field, '_hide', !!(hide || field.hide));
const c = field.formControl;
if (c['_fields'].length > 1) {
c.updateValueAndValidity({ emitEvent: false });
updateValidity(c);
}

hide === true && c['_fields'].every(f => !!f._hide)
Expand Down
4 changes: 2 additions & 2 deletions src/core/src/lib/extensions/field-form/field-form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { FormlyExtension, FormlyConfig } from '../../services/formly.config';
import { FormlyFieldConfigCache } from '../../components/formly.field.config';
import { FormGroup, FormControl, AbstractControlOptions, Validators } from '@angular/forms';
import { getFieldValue, defineHiddenProp } from '../../utils';
import { registerControl, findControl } from './utils';
import { registerControl, findControl, updateValidity as updateControlValidity } from './utils';
import { of } from 'rxjs';

/** @experimental */
Expand Down Expand Up @@ -84,7 +84,7 @@ export class FieldFormExtension implements FormlyExtension {
});

if (!c.parent) {
c.updateValueAndValidity({ emitEvent: false });
updateControlValidity(c);
} else {
updateValidity = true;
}
Expand Down
9 changes: 9 additions & 0 deletions src/core/src/lib/extensions/field-form/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { FormArray, FormGroup, FormControl, AbstractControl } from '@angular/for
import { FormlyFieldConfig } from '../../core';
import { getKeyPath, getFieldValue, isNullOrUndefined, defineHiddenProp, wrapProperty, assignModelValue, isUndefined } from '../../utils';
import { FormlyFieldConfigCache } from '../../components/formly.field.config';
import { EventEmitter } from '@angular/core';

export function unregisterControl(field: FormlyFieldConfig, emitEvent = false) {
const form = field.formControl.parent as FormArray | FormGroup;
Expand Down Expand Up @@ -117,6 +118,14 @@ export function registerControl(field: FormlyFieldConfigCache, control?: any, em
}
}

export function updateValidity(c: AbstractControl) {
const status = c.status;
c.updateValueAndValidity({ emitEvent: false });
if (status !== c.status) {
(c.statusChanges as EventEmitter<string>).emit(c.status);
}
}

function updateControl(form: FormGroup|FormArray, opts: { emitEvent: boolean }, action: Function) {
/**
* workaround for https://github.com/angular/angular/issues/27679
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { FormlyExtension, FieldValidatorFn, FormlyConfig } from '../../services/
import { FormlyFieldConfigCache } from '../../components/formly.field.config';
import { AbstractControl, Validators, ValidatorFn } from '@angular/forms';
import { isObject, FORMLY_VALIDATORS, defineHiddenProp, isPromise, wrapProperty } from '../../utils';
import { updateValidity } from '../field-form/utils';

/** @experimental */
export class FieldValidationExtension implements FormlyExtension {
Expand Down Expand Up @@ -47,7 +48,7 @@ export class FieldValidationExtension implements FormlyExtension {
VALIDATORS.push(opt);
}
if (!firstChange && field.formControl) {
field.formControl.updateValueAndValidity({ emitEvent: false });
updateValidity(field.formControl);
}
}));

Expand Down

0 comments on commit 7deac1a

Please sign in to comment.