ngForm
方式創(chuàng)建表單時,其內(nèi)部的每個 input 元素都必須有name屬性,Angular 表單用它注冊控件。實質(zhì)上是ngModel
和name
屬性一起創(chuàng)建了一個FormControl
。Required、minLength、maxLength、pattern
,我們可以將這些標簽應用到我們的輸入控件上。
valid
)的,還是不合法(invalid
)的。
我們來修改一下代碼:
// demo-form.component.html
<div class="box">
<form #userForm="ngForm" (ngSubmit)="onSubmit(userForm.form.valid)" novalidate>
<div>
<label>
用戶:<input type="text" name="name" [(ngModel)]="name" required>
</label>
<p *ngIf="userForm.controls['name']?.invalid" class="error">用戶名必填</p>
</div>
<div>
<label>
電話:<input type="text" name="tel" [(ngModel)]="tel" pattern="1[3|5|8]\d{9}" required>
</label>
</div>
<div>
<label>
性別:
<select [(ngModel)]="sex" name="sex" required>
<option value="man">男</option>
<option value="female">女</option>
</select>
</label>
<p *ngIf="userForm.controls['sex']?.errors?.required"></p>
</div>
<button type="submit" [disabled]="!userForm.form.valid">發(fā)布</button>
</form>
</div>
在上面的代碼中,我們?yōu)槿齻€表單都增加required
必填屬性,同時在提交按鈕上添加disabled
屬性,并且值是userForm.form.valid
,這表示只有當前form里所有表單元素(input,select等)都合法時,才可以提交,否則禁用按鈕。
還有在input[name='name']
底部添加一個驗證提示:
<p *ngIf="userForm.controls['name']?.invalid" class="error">用戶名必填</p>
在前面提過,Angular使用ngModel
和name
屬性構建了一個FormControl
,這也是我們可以通過NgForm.controls
獲取里面所有具有name
屬性的表單,它是一個數(shù)組。
而對于每一個FormControl
,它都有以下驗證屬性:
errors
包含了表單所有的驗證內(nèi)容。比如:
form.controls.name.errors.required // 必填項
form.controls.name.errors.minlength // 最小數(shù)
form.controls.name.errors.maxlength // 最大數(shù)
當然,除了通過form
的模板變量來訪問其內(nèi)的表單元素,我們也可以為其內(nèi)的表單元素定義自己的模板變量。
我們修改一下input[name=sex]
:
<div>
<label>
性別:
<select [(ngModel)]="sex" name="sex" required #sexInput="ngModel">
<option value="man">男</option>
<option value="female">女</option>
</select>
</label>
<p *ngIf="sexInput.invalid" class="error">不合法</p>
<p *ngIf="sexInput.errors?.required"></p>
</div>
在上面的代碼中,我們通過#sexInput="ngModel"
來獲取到當前input的FormControl
。
更多建議: