我正在尝试检查表单是否有效以防止进一步执行,如果不是。
这是我的表格:
<form (ngSubmit)="updateFirstName(firstNameForm)" #firstNameForm="ngForm" novalidate>
<div class="form-group" ng-class="getCssClasses(formCtrl, formCtrl.firstName)">
<div class="input-group">
<input type="text"
ngControl="firstName"
#firstName="ngForm"
required
minlength="2"
maxlength="35"
pattern_="FIRST_NAME_PATTERN"
[ngModel]="currentUserAccount?.firstName"
(ngModelChange)="currentUserAccount ? currentUserAccount.firstName = $event : null"
placeholder="{{'FIRST_NAME_FORM.NEW_FIRST_NAME'| translate }}"
class="form-control"/>
</div>
<div [hidden]="firstName.valid">
<div *ngIf="firstName?.errors?.minlength" class="control-label">{{'FIRST_NAME_FORM.MIN_LENGTH'| translate}}</div>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary pull-right" [disabled]="buttonDisabled">{{'FIRST_NAME_FORM.SUBMIT'| translate}}</button>
<a [routerLink]="['/dashboard/useraccount']" class="btn btn-link pull-right text-right">{{'FORM_CANCEL' | translate}}</a>
</div>
</form>
但是,当我提交无效表单时,我会在控制台中注意到NgForm
的有效属性为true
...
updateFirstName(firstNameForm) {
console.log(firstNameForm);//the valid attribute of firstNameForm is true...
}
任何人都可以让我知道为什么会这样吗?
答案 0 :(得分:13)
您正在进行模板驱动表单。请参阅这个简单的plunk
<h1>Employee Form</h1>
<form #personForm="ngForm" (submit)="personFormSubmit(personForm)" novalidate>
<div>
<div>
<input id="nameInput" type="text" name="name"
ngControl="name"
required
minlength="2"
maxlength="35"
[(ngModel)]="person.name" />
</div>
</div>
<div>
<button type="submit">Submit</button>
</div>
<div style="color: red">{{validationMessage}}</div>
</form>
然后是控制器:
import { Component } from '@angular/core';
import { FORM_DIRECTIVES, ControlGroup, Control, Validators, FormBuilder, Validator, } from '@angular/common';
import 'rxjs/Rx';
export class Person {
id: number;
name: string;
}
@Component({
selector: 'my-app',
directives: [FORM_DIRECTIVES],
templateUrl: 'app/app.component.html'
})
export class AppComponent {
person: Person;
validationMessage: string;
constructor() {
this.person = new Person();
this.validationMessage = "";
}
personFormSubmit(personForm: ControlGroup) {
if (personForm.valid) {
this.validationMessage = "Form Is Valid";
}
else
{
this.validationMessage = "Form Is Not Valid";
}
}
}
如果您想转向更复杂的动态验证,那么转换为模型驱动的表单会更好。与此plunk
一样答案 1 :(得分:5)
这是预期的行为
我在2.0.0-alpha.46(2015-11-11)的更改日志中找到了
以前,ControlGroup和ControlArray的controlsErrors getter返回了直接子节点的错误。这很令人困惑,因为结果不包括嵌套子项的错误(ControlGroup - &gt; ControlGroup - &gt; Control)。使controlsErrors包含此类错误需要发明一些自定义序列化格式,应用程序必须理解这些格式。由于controlsErrors只是一种方便的方法,并且它引起了混乱,我们正在删除它。如果要将整个表单的错误序列化为单个对象,可以手动遍历表单并累积错误。通过这种方式,您可以更好地控制错误的序列化方式。
然后应更新ControlGroup
和ControlArray
的文档
另见https://github.com/angular/angular/issues/6504#issuecomment-171950667
您可以检查firstNameForm.valid
是否为false
,然后迭代控制组和控件以查找错误。
NgForm
类具有errors
属性,因为它继承自AbstractControlDirective
,但嵌套控件的错误不会在那里收集。