angular - 单击表单中的提交时出现“错误类型错误:无法读取 null 的属性‘必需’”(使用 Angular 进行验证)
问题描述
我正在尝试向表单添加验证。当我添加该userFormsErrors
部分时,表格开始表现得很有趣,我似乎无法解决问题。
我的第一个问题是,当单击按钮时,userFormErrors
返回 true,然后即使用户更改输入,它也保持为 true。
我的第二个问题是电子邮件验证和密码确认不起作用(在我进行这些最近的更改 iirc 之前它们曾经起作用)。
我的第三个问题是我在ERROR TypeError: Cannot read property 'required' of null
单击提交按钮时遇到的错误,然后每次输入字段发生变化(这很可能与我的第一个问题有关)。
下面是 register.component.html 和 register.component.ts 中的代码
<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>
ngOnInit(): void {
const notFocused = false;
}
onRegisterUser(isValid, data){
if(!isValid) {
return this.userFormErrors = true;
}
console.log(isValid, data);
}
解决方案
ngModel.errors
null
如果您的输入有效,则可以。因此,您应该errors
在请求该required
字段之前进行检查。您可以使用 来执行此操作?
,例如:someField.errors?.required
。
如果您需要userFormErrors
通过更改输入来更新,则必须在更改时添加事件侦听器,并userFormErrors
在任何输入更改时更新。但是如果你需要获取valid
表单的当前状态,你可以ngForm
直接从那里获取。
推荐阅读
- java - 当文本溢出而不是换行时,TextView 会拉伸 CardView
- c++ - 链接节点列表,分段FAULT
- jquery - 声明或语句预期的 jquery 错误
- ios - 在 App Store Connect 销售/分析仪表板上未显示在 App Purchase 中?
- angular - Ngx-Bootstrap Popover 和 Ngx-popover 名称引用冲突
- php - wp_category 映射:id & name
- c++ - 无法读取 .blk 文件 C++ (Visual Studios)?
- c# - x => x + 1 和 x => x += 1 之间有区别吗?
- django - 如何修复“django.contrib.gis.geoip2 没有属性 GeoIP2”
- ios - 重叠的嵌套标签栏控制器