【发布时间】:2018-01-31 23:56:35
【问题描述】:
我有两个使用 FormControl 的输入,它们始终显示为有效,但如果我取出一个,那么其余的将按预期有效/无效。我会为一个 ControlGroup 更改两个表单控件,但是 1.) 我想了解我做错了什么,以及 2.) 我需要访问一个表单控件以实现组件中的自动完成功能。
相关 HTML:
<form
fxLayout="column"
fxLayoutAlign="center center"
(ngSubmit)="onSubmit(status, count)"
#statusForm="ngForm"
>
<!-- Status Input -->
<div>
<mat-form-field>
<input
matInput placeholder="Status"
[formControl]="statusFormControl"
[errorStateMatcher]="matcher"
[matAutocomplete]="auto"
[(ngModel)]="status"
name="status"
required
>
<mat-error *ngIf="statusFormControl.hasError('required')">
Status is <strong>required</strong>
</mat-error>
</mat-form-field>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let status of filteredStatusList | async" [value]="status.name">
{{ status.name }}
</mat-option>
</mat-autocomplete>
</div>
<!-- Count Input -->
<mat-form-field>
<input
matInput placeholder="Count"
[formControl]="countFormControl"
type="number"
min="1"
[(ngModel)]="count"
name="count"
required
>
<mat-error *ngIf="countFormControl.hasError('required')">
Count must be a <strong>number</strong>
</mat-error>
</mat-form-field>
{{statusForm.valid}}
{{statusForm.invalid}}
<button
mat-raised-button color="primary"
*ngIf="statusForm.valid"
type="submit"
[disabled]="statusForm.invalid"
>
Add
</button>
和 TS:
export class ... {
statusFormControl = new FormControl('', [
Validators.required
]);
countFormControl = new FormControl('', [
Validators.required
]);
...
constructor() {
this.filteredStatusList = this.statusFormControl.valueChanges
.pipe(
startWith(''),
map(status => status ? this.filterStatusList(status) : this.allStatuses.slice())
);
}
filterStatusList(statusName: string) {
return this.allStatuses.filter(status =>
status.name.toLowerCase().indexOf(statusName.toLowerCase()) === 0);
}
}
【问题讨论】:
-
我不知道这是否会导致您的问题......但强烈建议我们使用模板驱动的表单或反应式表单......而不是两者。目前您正在使用两者。除了模板中的
ngModel之外,代码中还有new FormControl。考虑删除ngModel并使用响应式表单。
标签: angular angular-forms angular-validation