Validators.required 会引发错误,即使其中有一个值

Posted

技术标签:

【中文标题】Validators.required 会引发错误,即使其中有一个值【英文标题】:Validators.required throws an error, even though there is a value inside of it 【发布时间】:2019-04-15 03:19:49 【问题描述】:

我的问题是我有一个 MatInput 如下:

<input matInput [(ngModel)]="name" i18n-placeholder="@@Placeholder" placeholder="Your name" [formControl]="InputControl" value=" fieldName ">

在对应的组件中,我声明了fieldName: string;,并在ngOnInit() 方法中设置了值:

ngOnInit() 
        this.fieldName = "VALUE"; // obtained from server so it may differ
        if(this.fieldName.startsWith("PREFIX"))  // if value starts with a given prefix I want to remove it
            this.fieldName = this.fieldName.substr(3);
        

问题是它实际上运行良好(值会正确显示),但只要我想提交 MatDialog 表单,它就会告诉我不能提交空表单!那是因为我添加了一个“必需”验证器:

InputControl = new FormControl("", [Validators.required]);

所以输入字段中有一个值,但显然 Angular 没有注意到它?如果我为该值添加一个空格并在之后将其删除,则该值完全相同,但它不会引发任何错误。 有谁知道如何解决这一问题?真的很烦。

【问题讨论】:

您使用的是ngModel,但也在谈论FormControl。这是两个相互冲突的表单实现:ngModel 双向数据绑定不能与FormControl 一起使用,反之亦然。要么使用formControl 指令将@ 绑定到FormControl 对象,要么使用required 属性在不使用FormControl 的情况下使输入成为必需。另见:What are the practical differences between template-driven and reactive forms? 您正在混合ngModel 和 value 和 FormControl,您确定要设置 value 吗?也许您想设置输入name="fieldName"name,或者您想设置一个默认值?然后你应该更新this.name = this.fieldName.. 【参考方案1】:

value 属性在 Angular 中毫无价值。

如果你想给你的控件一个值,通过控件本身来做:

<input matInput [(ngModel)]="name" i18n-placeholder="@@Placeholder" placeholder="Your name" [formControl]="InputControl">
ngOnInit() 
  this.fieldName = "VALUE"; // obtained from server so it may differ
  if(this.fieldName.startsWith("PREFIX"))  
    this.fieldName = this.fieldName.substr(3);
  
  // w/ form control
  this.InputControl.setValue(this.fieldName);
  // w/ template driven
  this.name = this.fieldName;

【讨论】:

(另外,请听 cmets 关于您的问题,不要同时使用 formControlngModel 我已经尝试过了,但后来出现 ExpressionChangedAfterItHasBeenCheckedError 异常。 无论如何,谢谢,我已经修好了,只需要说 this.name(型号名称)而不是我的第一个想法。

以上是关于Validators.required 会引发错误,即使其中有一个值的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular 2 FormGroup 获取所有验证错误

角反应形式,输入的默认值

如何设置嵌套 formBuilder 组的值

在表单组上设置验证器

如何验证 angular2 中的 FormArray 长度

带有 reCAPTCHA v3 的角反应形式