有没有办法检查是否需要控制?
当我实现一个专门的表单字段组件来接受FormControl
时,问题就出现了。该组件不仅具有input
,还具有验证错误。由于某些字段是必填的,因此让用户知道是否需要通过*
表示是很好的。
有没有办法检查@Input() control: FormControl
是否需要Validators.required
,并显示星号?
有没有办法检查是否需要控制?
当我实现一个专门的表单字段组件来接受FormControl
时,问题就出现了。该组件不仅具有input
,还具有验证错误。由于某些字段是必填的,因此让用户知道是否需要通过*
表示是很好的。
有没有办法检查@Input() control: FormControl
是否需要Validators.required
,并显示星号?
你可以像这样做:
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, AbstractControl } from '@angular/forms';
@Component({...})
export class AppComponent {
form: FormGroup = new FormGroup({
control: new FormControl(null, Validators.required)
});
get validator() {
const validator = this.form.get('control').validator({} as AbstractControl);
console.log(validator);
if (validator && validator.required) {
return true;
}
}
}
然后在您的模板中:
<form [formGroup]="form" (submit)="onSubmit()">
Control: <span *ngIf="validator">*</span> <input type="text" formControlName="control">
<button>Submit</button>
</form>
注意: 只需使用 this.form.get('control').validator({} as AbstractControl);
获取表单控件作为AbstractControl
类型即可。
这将返回一个对象,其中包含在您的FormControl
上存在的验证器列表。然后,您可以检查对象中的required
键是否存在以及其值是否为true
,则可以确定FormControl
上应用了必填项验证器。
这里是一个适用于您参考的Working Sample StackBlitz。
我需要一些更抽象的东西,所以我稍微改编了@siddajmera的答案,以便能够在任何字段上使用。
在你的 .ts
文件中:
isRequiredField(field: string) {
const form_field = this.testForm.get(field);
if (!form_field.validator) {
return false;
}
const validator = form_field.validator({} as AbstractControl);
return (validator && validator.required);
}
接着,在您的模板文件中:
<div>
<label>Some Field:<span *ngIf="isRequiredField('some_field')">*</span></label>
<input [formControl]="form.controls['some_field']">
</div>
<div>
<label>Some Field:<span *ngIf="isRequiredField('another_field')">*</span></label>
<input [formControl]="form.controls['another_field']">
</div>
ERROR TypeError: form_field.validator is not a function
的可能性。 - mproObject is possibly 'null'
错误在 form_field.validator({} as AbstractControl)
中吗? - johannesMatevosyanlet abstractControl = this.formGroup.controls[this.formControlName];
const isRequired = abstractControl.hasValidator(Validators.required);
ControlRequiredPipe
添加到了AppModule
的providers
和declarations
部分。当将管道添加到providers
部分时,它也可以在Component
TypeScript类中使用。我已经将这种行为包含在AppComponent
的OnSubmit
函数中。
Stackblitz示例
AppComponent
:<form [formGroup]="form" (submit)="onSubmit()">
Control: <strong *ngIf="form.get('control') | controlRequired">*</strong>
<input type="text" formControlName="control">
<button>Submit</button>
</form>
import { Component } from "@angular/core";
import { FormGroup, FormControl, Validators } from "@angular/forms";
import { ControlRequiredPipe } from "./control-required.pipe";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
form: FormGroup = new FormGroup({
control: new FormControl(null, [
Validators.required,
Validators.minLength(8)
])
});
constructor(private controlRequiredPipe: ControlRequiredPipe) {}
onSubmit() {
alert(
`The required state of the FormControl is: ${this.controlRequiredPipe.transform(
this.form.get("control")
)}`
);
}
}
ControlRequiredPipe
:
import { Pipe, PipeTransform } from "@angular/core";
import { AbstractControl } from "@angular/forms";
@Pipe({
name: "controlRequired"
})
export class ControlRequiredPipe implements PipeTransform {
public transform(control: AbstractControl): boolean {
// Return when no control or a control without a validator is provided
if (!control || !control.validator) {
return false;
}
// Return the required state of the validator
const validator = control.validator({} as AbstractControl);
return validator && validator.required;
}
}
AppModule
:
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { AppComponent } from "./app.component";
import { ControlRequiredPipe } from "./control-required.pipe";
@NgModule({
imports: [BrowserModule, FormsModule, ReactiveFormsModule],
declarations: [AppComponent, ControlRequiredPipe],
providers: [ControlRequiredPipe],
bootstrap: [AppComponent]
})
export class AppModule {}
setValidators/updateValueAndValidity
模式将2个控件标记为必填项问题在于构建的管道不会触发第二次,因为管道仅将整个FormControl视为参数。幸运的是,这是一个简单的修复方法:
// HTML
Control: <strong *ngIf="form.get('control').validator | controlRequired">*</strong>
// PIPE
export class ControlRequiredPipe implements PipeTransform {
public transform(validatorFn: ValidatorFn): boolean {
// Return when no control or a control without a validator is provided
if (!validatorFn) {
return false;
}
// Return the required state of the validator
const validator = validatorFn({} as AbstractControl) || {};
return validator && validator.required;
}
}
您可以使用 required 属性。
<input type="text" formControlName="control" placeholder="Some Field" required>
const validator = this.control.validator ? this.control.validator({} as AbstractControl) : '';
。 - SergeyminLength
等怎么样?我尝试了控制台,但只得到了{required: true}
。我正在调查console.log(validator)
。 - Sergeyif (control.setErrors === undefined) return;
- StefanJanssen