【发布时间】:2021-12-25 20:10:39
【问题描述】:
我正在检查这个question 及其答案以便发帖。
public isFirst = false;
public isSecond = false;
private buildFormGroup() {
const internalFormGroup = this.formBuilder.group({
idTypeCode: ['', [Validators.required, Validators.min(1)]],
master: [true],
slave: [''],
fieldSlave: [''], // Validations depends indirectly on idTypeCode !!! HERE
});
return internalFormGroup;
}
private conditionalValidator(masterName: string, masterValue: any, slaveName: string, validators: any) {
if (this.formGroup) {
const masterControl = this.formGroup.get(masterName);
if (masterControl) {
masterControl.valueChanges.subscribe((value) => {
const slaveControl = this.formGroup.get(slaveName);
if (slaveControl) {
if (value === masterValue) {
slaveControl.setValidators(validators);
} else {
slaveControl.clearValidators();
}
slaveControl.updateValueAndValidity();
}
});
}
}
}
public onTypeCodeChange(event: MatSelectChange) {
const selectedId = +event;
const selectedTypeCode = this.typeCodes.find((typeCode) => typeCode.id === selectedId);
this.isFirst = selectedTypeCode?.codeEnum === CodeEnum.First;
this.isSecond = selectedTypeCode?.codeEnum === CodeEnum.Second;
}
我跳过了填充可观察到的代码typeCodes$
public readonly typeCodes$: Observable<TypeCodeDto[]>;
private typeCodes: TypeCodeDto[] = [];
public ngOnInit(): void {
this.typeCodes$.subscribe((typeCodes) => {
this.typeCodes = typeCodes;
});
this.conditionalValidator('master', false, 'slave', [Validators.required, Validators.min(1)]);
}
如您所见,conditionalValidator 方法的使用很简单!!!。
但是,我有一个包含一个枚举的接口
export interface TypeCodeDto {
id?: number;
name?: string;
codeEnum?: CodeEnum;
}
export enum CodeEnum {
None = 0,
First = 1,
Second = 2,
}
在我的 HTML 中,我使用 Select 和之前可观察到的 typeCodes$
<mat-select
formControlName="idTypeCode"
[required]="formGroup.controls.idTypeCode.invalid"
(ngModelChange)="onTypeCodeChange($event)"
>
<mat-option *ngFor="let typeCode of typeCodes$ | async" [value]="typeCode.id">
{{ typeCode.name }}
</mat-option>
</mat-select>
现在我有一个复杂的情况,在我的 HTML 中,当Select(或idTypeCode)对应一个TypeCodeDto 和codeEnum 等于Second 我需要申请:
fieldSlave: ['', [Validators.required, Validators.maxLength(256), Validators.minLength(1)]],
如何实现?
【问题讨论】:
-
你在 mat-select 上使用 ngmodel 和响应式表单吗?
-
@vega 为什么?,不推荐?还是有不好的一面?提前致谢!
-
@Anita,不,使用其中一个,但不要一起使用。这可能会有所帮助:angular.io/api/forms/…
标签: angular angular-reactive-forms angular-validator nested-properties