diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 5b446c3f3e6..3455ddf2f6f 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -85,6 +85,7 @@ "DomRendererFactory2", "EFFECTS", "EFFECTS_TO_SCHEDULE", + "EMAIL_REGEXP", "EMBEDDED_VIEW_INJECTOR", "EMPTY_ARRAY", "EMPTY_OBJ", @@ -261,6 +262,7 @@ "UnsubscriptionError", "VALID", "VIEW_REFS", + "Validators", "ValueChangeEvent", "ViewContainerRef", "ViewEncapsulation", @@ -501,6 +503,7 @@ "elementAttributeInternal", "elementLikeEndShared", "elementLikeStartShared", + "emailValidator", "enterDI", "enterView", "epoch", @@ -793,6 +796,8 @@ "markViewForRefresh", "markedFeatures", "matchTemplateAttribute", + "maxLengthValidator", + "maxValidator", "maybeQueueEnterAnimation", "maybeReturnReactiveLViewConsumer", "maybeUnwrapEmpty", @@ -804,6 +809,8 @@ "mergeHostAttrsAcrossInheritance", "mergeInputsWithTransforms", "mergeValidators", + "minLengthValidator", + "minValidator", "modelGroupProvider", "moduleBootstrapImpl", "multiFactory", @@ -837,6 +844,7 @@ "parseAndConvertInputsForDefinition", "parseAndConvertOutputsForDefinition", "parseCookieValue", + "patternValidator", "performanceMarkFeature", "pickAsyncValidators", "pickValidators", @@ -892,6 +900,7 @@ "renderStringify", "renderView", "reportUnhandledError", + "requiredTrueValidator", "requiredValidator", "requiresRefreshOrTraversal", "resetConsumerBeforeComputation", diff --git a/packages/forms/src/model/abstract_model.ts b/packages/forms/src/model/abstract_model.ts index 31b48db88f6..b148b2b5c4e 100644 --- a/packages/forms/src/model/abstract_model.ts +++ b/packages/forms/src/model/abstract_model.ts @@ -31,6 +31,7 @@ import { hasValidator, removeValidators, toObservable, + Validators, } from '../validators'; import type {FormArray} from './form_array'; import type {FormGroup} from './form_group'; @@ -502,6 +503,9 @@ export abstract class AbstractControl< /** @internal */ _updateOn?: FormHooks; + /** @internal */ + _hasRequired = signal(false); + private _parent: FormGroup | FormArray | null = null; private _asyncValidationSubscription: any; @@ -581,6 +585,7 @@ export abstract class AbstractControl< } set validator(validatorFn: ValidatorFn | null) { this._rawValidators = this._composedValidatorFn = validatorFn; + this._updateHasRequiredValidator(); } /** @@ -1784,6 +1789,7 @@ export abstract class AbstractControl< private _assignValidators(validators: ValidatorFn | ValidatorFn[] | null): void { this._rawValidators = Array.isArray(validators) ? validators.slice() : validators; this._composedValidatorFn = coerceToValidator(this._rawValidators); + this._updateHasRequiredValidator(); } /** @@ -1795,4 +1801,8 @@ export abstract class AbstractControl< this._rawAsyncValidators = Array.isArray(validators) ? validators.slice() : validators; this._composedAsyncValidatorFn = coerceToAsyncValidator(this._rawAsyncValidators); } + + private _updateHasRequiredValidator(): void { + untracked(() => this._hasRequired.set(this.hasValidator(Validators.required))); + } }