【问题标题】:Angular 4 Reactive Forms FormControl errors is nullAngular 4 Reactive Forms FormControl 错误为空
【发布时间】:2018-02-07 13:21:23
【问题描述】:

如果我在没有输入任何内容的情况下浏览文本输入,则会显示错误消息 div,表明所需的验证器已正确触发。但是,如果我在其中一个字段中输入任何内容,控制台会立即抛出此错误:

Cannot read property 'required' of null

这是我的组件:

import { PasswordValidators } from './../validators/password.validators';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';

@Component({
  selector: 'app-changepassword-form',
  templateUrl: './changepassword-form.component.html',
  styleUrls: ['./changepassword-form.component.css']
})
export class ChangepasswordFormComponent {

  form;

  constructor(fb: FormBuilder) {
    this.form = fb.group({
      newPassword: ['', Validators.required],
      confirmPassword: ['', Validators.required]
    })
  }

  get newPassword() {
    return this.form.get('newPassword');
  }

  get confirmPassword() {
    return this.form.get('confirmPassword');
  }

}

和 HTML:

<form [formGroup]="form">  
  <div class="form-group">
    <label for="newPassword">New Password</label>
    <input formControlName="newPassword" id="newPassword" type="text" class="form-control">
    <div class="alert alert-danger" *ngIf="newPassword.touched && newPassword.errors.required">
      Required
    </div>
  </div>
  <div class="form-group">
    <label for="confirmPassword">Confirm Password</label>
    <input formControlName="confirmPassword" id="confirmPassword" type="text" class="form-control">
    <div class="alert alert-danger" *ngIf="confirmPassword.touched && confirmPassword.errors.required">
      Required
    </div>
  </div>

  <p><button class="btn btn-primary">Submit</button></p>

</form>

【问题讨论】:

    标签: javascript angular typescript angular-reactive-forms


    【解决方案1】:

    这个错误来自这个:

    *ngIf="newPassword.touched && newPassword.errors.required"
    

    当您输入一个值时,不再有错误集合,因此检查 newPassword.errors.required 会生成 Cannot read property 'required' of null 错误。

    试试这样的:

    *ngIf="newPassword.touched && newPassword.errors?.required"
    

    例如,我的看起来像这样:

                <div class="col-md-8">
                    <input class="form-control" 
                            id="productNameId" 
                            type="text" 
                            placeholder="Name (required)"
                            required
                            minlength="3"
                            [(ngModel)] = product.productName
                            name="productName"
                            #productNameVar="ngModel" />
                    <span class="help-block" *ngIf="(productNameVar.touched ||
                                                     productNameVar.dirty || product.id !== 0) &&
                                                     productNameVar.errors">
                        <span *ngIf="productNameVar.errors.required">
                            Product name is required.
                        </span>
                        <span *ngIf="productNameVar.errors.minlength">
                            Product name must be at least three characters.
                        </span>
                    </span>
                </div>
    

    【讨论】:

    • 谢谢,这真的让我陷入了困境——这有点道理,有点出乎意料。我认为也许一个好的做法是将这些错误消息 div 与另一个带有 *ngIf 检查 control.isValid 以避免此问题。
    【解决方案2】:

    你也可以使用下面的语法,它不需要先有值就可以工作:

    form.get('newPassword').hasError('required')
    

    这将检查错误中的“必需”。

    这也可以,而且更简洁:

    form.hasError('required','newPassword')
    

    如果你使用 AOT 选项编译,根据这个article,你应该使用 hasError() 语法:

    不要使用 control.errors?.someError,使用 control.hasError('someError')

    【讨论】:

    • hasError(errorCode: string, path?: string[]): boolean;如果具有给定路径的控件具有指定的错误,则返回 true。否则返回 false。如果没有给出路径,它会检查当前控件的错误。 - 角度
    猜你喜欢
    • 2020-04-07
    • 2021-10-23
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2021-11-13
    • 2019-06-22
    • 2019-08-13
    相关资源
    最近更新 更多