如何使用 angular 中已存在的默认值强制输入字段?
How to make an input field mandatory with a default value already present in angular?
我有一个输入框并且已经有一些默认值的情况,我希望用户在提交表单之前向其中添加一些内容,否则它应该作为必填字段出现。
尝试了一些方法但对我没有用 -
我的HTML-
<mat-form-field appearance="outline">
<mat-label>Value <mark *ngIf="isRequired" class="red">*</mark></mat-label>
<input formControlName="LinkFull" type="text" matInput autocomplete="off" />
</mat-form-field>
在我的 TS -
ngOnInit(){
...
this.form.get('LinkFull').setValue(Constants.DefaultValue);
}
在某些下拉菜单更改中,我正在这样做 -
if(this.IDSelected == 1 ){
if(this.form.get('LinkFull').value == Constants.DefaultValue){
this.form.get('LinkFull').setValidators(Validators.required);
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = true;
}
else{
this.form.get('LinkFull').clearValidators();
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = false;
}
}
else{
this.form.get('LinkFull').clearValidators();
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = false;
}
但在提交表单时,此字段仍未作为必填字段。谁能帮助实现这一目标?
您可以创建自定义验证器来检查默认值并使用它验证输入
export class customValidators{
public static requiredWithDefault(defaultValue: string) {
return (control: AbstractControl): ValidationErrors | null => {
if (control.value == defaultValue)
return { defaultValue: 'value '+defaultValue+' is the default value' }
return null;
}
}
}
然后在控制定义中使用它,例如
this.form=new FormGroup({
...,
LinkFull:new FormControl(Constants.DefaultValue,[customValidators.requiredWithDefault(Constants.DefaultValue)]),
...
})
由于 LinkFull
已经有一个值,因此不会由于您使用的所需验证器而导致错误。您可以创建自定义验证器,例如:
static requiredNonDefault(): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } => {
return (!control.value || control.value === Constants.DefaultValue) ? { required: true } : null;
};
}
并改用它:
ngOnInit(){
...
this.form.get('LinkFull').setValidators(requiredNonDefault());
}
我有一个输入框并且已经有一些默认值的情况,我希望用户在提交表单之前向其中添加一些内容,否则它应该作为必填字段出现。
尝试了一些方法但对我没有用 -
我的HTML-
<mat-form-field appearance="outline">
<mat-label>Value <mark *ngIf="isRequired" class="red">*</mark></mat-label>
<input formControlName="LinkFull" type="text" matInput autocomplete="off" />
</mat-form-field>
在我的 TS -
ngOnInit(){
...
this.form.get('LinkFull').setValue(Constants.DefaultValue);
}
在某些下拉菜单更改中,我正在这样做 -
if(this.IDSelected == 1 ){
if(this.form.get('LinkFull').value == Constants.DefaultValue){
this.form.get('LinkFull').setValidators(Validators.required);
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = true;
}
else{
this.form.get('LinkFull').clearValidators();
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = false;
}
}
else{
this.form.get('LinkFull').clearValidators();
this.form.get('LinkFull').updateValueAndValidity();
this.isRequired = false;
}
但在提交表单时,此字段仍未作为必填字段。谁能帮助实现这一目标?
您可以创建自定义验证器来检查默认值并使用它验证输入
export class customValidators{
public static requiredWithDefault(defaultValue: string) {
return (control: AbstractControl): ValidationErrors | null => {
if (control.value == defaultValue)
return { defaultValue: 'value '+defaultValue+' is the default value' }
return null;
}
}
}
然后在控制定义中使用它,例如
this.form=new FormGroup({
...,
LinkFull:new FormControl(Constants.DefaultValue,[customValidators.requiredWithDefault(Constants.DefaultValue)]),
...
})
由于 LinkFull
已经有一个值,因此不会由于您使用的所需验证器而导致错误。您可以创建自定义验证器,例如:
static requiredNonDefault(): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } => {
return (!control.value || control.value === Constants.DefaultValue) ? { required: true } : null;
};
}
并改用它:
ngOnInit(){
...
this.form.get('LinkFull').setValidators(requiredNonDefault());
}