首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在表单中单击提交时得到"ERROR TypeError: Cannot read property 'required‘of null“(使用Angular验证)

在表单中单击提交时得到"ERROR TypeError: Cannot read property 'required‘of null“(使用Angular验证)
EN

Stack Overflow用户
提问于 2020-07-27 17:57:44
回答 1查看 81关注 0票数 0

我正在尝试向表单添加验证。当我添加userFormsErrors部件时,表单开始变得奇怪,我似乎无法解决这个问题。

我的第一个问题是,当单击按钮时,userFormErrors返回true,然后即使用户更改了输入,它也会保持true。

我的第二个问题是电子邮件验证和密码确认不起作用(在我最近做这些更改之前,它们是起作用的)。

我的第三个问题是,当我单击submit按钮,然后每次输入字段发生变化时,我都会得到ERROR TypeError: Cannot read property 'required' of null错误(这很可能与我的第一个问题有关)。

下面是用register.component.html和register.component.ts编写的代码

代码语言:javascript
复制
    <form action="get" href="#" #userForm="ngForm">
      <div class="row">
        <div class="col-md-6 px-2">
          <div class="form-group formfields noselect">
            <label for="firstName">First Name</label>
            <input type="text" class="form-control" id="firstName" [attr.placeholder]="'Enter Credential'" ngModel
              name="firstName" #firstName="ngModel" required="required" 
              [ngClass]="{ 'is-invalid': firstName.invalid && (firstName.dirty || firstName.touched) || userFormErrors }">
            <div class="invalid-credentials pl-3"
              *ngIf="firstName.invalid && (firstName.dirty || firstName.touched) || userFormErrors">
              <div *ngIf="firstName.errors.required">
                <p class="pt-2">Name is required</p>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6 px-2">
          <div class="form-group formfields noselect">
            <label for="lastName">Last Name</label>
            <input type="text" class="form-control" id="lastName" [attr.placeholder]="'Enter Credential'" ngModel
              name="lastName" #lastName="ngModel" required="required"
              [ngClass]="{ 'is-invalid': lastName.invalid && (lastName.dirty || lastName.touched) || userFormErrors }">
            <div class="invalid-credentials pl-3"
              *ngIf="lastName.invalid && (lastName.dirty || lastName.touched) || userFormErrors">
              <div *ngIf="lastName.errors.required">
                <p class="pt-2">Error message here!</p>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6 px-2">
          <div class="form-group formfields noselect">
            <label for="email">Email</label>
            <input type="email" class="form-control" id="email" [attr.placeholder]="'Enter Credential'" ngModel
              name="email" #email="ngModel" required="required" pattern="/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/"
              [ngClass]="{ 'is-invalid': email.invalid && (email.dirty || email.touched) || userFormErrors }">
            <div class="invalid-credentials pl-3"
              *ngIf="email.invalid && (email.dirty || email.touched) || userFormErrors">
              <div *ngIf="email.errors.required">
                <p class="pt-2">Email is required!</p>
              </div>
              <div *ngIf="email.errors.pattern">
                <p class="pt-2">You must type a valid email address!</p>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6 px-2">
          <div class="formgroup formfields noselect">
            <label for="location">Location</label>
            <select class="w-100" id="location" ngModel name="location" #location="ngModel" required="required"
              [ngClass]="{ 'is-invalid': location.invalid && (location.dirty || location.touched) || userFormErrors }">
              <option *ngFor="let country of countries" [value]="country.code">{{ country.name }}</option>
            </select>
            <img class="dropdown-icon d-inline" src="assets/images/icons/open-menu.svg">
            <div class="invalid-credentials pl-3"
              *ngIf="location.invalid && (location.dirty || location.touched) || userFormErrors">
              <div *ngIf="location.errors.required">
                <p class="pt-2">Error message here!</p>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6 px-2">
          <div class="form-group formfields noselect">
            <label for="password">Password</label>
            <input type="password" class="form-control" id="password" [attr.placeholder]="'Enter Credential'" ngModel
              name="password" #password="ngModel" required="required"
              [ngClass]="{ 'is-invalid': password.invalid && (password.dirty || password.touched) || userFormErrors }">
            <div class="invalid-credentials pl-3"
              *ngIf="password.invalid && (password.dirty || password.touched) || userFormErrors">
              <div *ngIf="password.errors.required">
                <p class="pt-2">Password is required!</p>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6 px-2">
          <div class="form-group formfields noselect">
            <label for="confirmPassword">Confirm Password</label>
            <input type="password" class="form-control" id="confirmPassword" [attr.placeholder]="'Enter Credential'" ngModel
              name="confirmPassword" #confirmPassword="ngModel" required="required" nomatch="confirmassword.value != password.value"
              [ngClass]="{ 'is-invalid': confirmPassword.invalid && (confirmPassword.dirty || confirmPassword.touched) || userFormErrors}">
            <div class="invalid-credentials pl-3"
              *ngIf="confirmPassword.invalid && (confirmPassword.dirty || confirmPassword.touched) || userFormErrors">
              <div *ngIf="confirmPassword.errors.required">
                <p class="pt-2">Please retype your password!</p>
              </div>
              <div *ngIf="confirmPassword.errors.nomatch">
                <p class="pt-2">Do not match</p>
              </div>
            </div>
          </div>
        </div>
       <button type="submit" class="btn btn-primary w-100 sign-in-btn mx-2 my-3" href="#"
          (click)="onRegisterUser(userForm.valid, userForm.value)">Register</button>
      </div>
    </form>
代码语言:javascript
复制
  ngOnInit(): void {
    const notFocused = false;
  }

  onRegisterUser(isValid, data){
    if(!isValid) {
     return this.userFormErrors = true;
    }
    console.log(isValid, data);
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-27 18:34:52

如果您的输入有效,则ngModel.errors可以为null。因此,您应该在请求required字段之前检查errors。您可以使用?来完成此操作,例如:someField.errors?.required

如果需要通过更改输入来更新userFormErrors,则必须在更改时添加事件侦听器,并在任何输入更改时更新userFormErrors。但是,如果您需要获取表单的当前valid状态,则可以直接从ngForm获取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63112897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档