Angular 4 中的模型驱动表单未显示验证错误

Validation errors not shown with model driven forms in Angular 4

我正在使用以下代码来验证错误,但没有看到任何错误消息。谁能帮忙。我已经使用 Form builder 在组件中设置了验证器。

当我只使用一种形式 - 组时它可以工作,但不能使用嵌套形式 - 组。

import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

import {ReactiveFormsModule, FormsModule, FormGroup, FormBuilder, Validators} from "@angular/forms";

@Component({
  selector: 'my-app',
  template: `
    <div class="login">
<form [formGroup]="registerForm" (ngSubmit)="dologin(form.value)">
 <div class="form-group" formGroupName="user" id ="user">
    <div class="form-group">
        <label for="username">Username</label>
        <input id="username" type="text" class="form-control" name="username" formControlName="username">

        <div [hidden]="registerForm.controls['username'].valid || registerForm.controls['username'].pristine"
        class="alert alert-danger"> Username is required.</div>
    </div>
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input id="password" type="password" class="form-control" name="password" [formControl]="registerForm.controls['password']">
        <div [hidden]="registerForm.controls['password'].valid || registerForm.controls['password'].pristine"
        class="alert alert-danger"> Password is required.</div>
    </div>
    <button type="button" (click)="logOut([registerForm])">Check vals</button>
    <button type="submit" [disabled]="!registerForm.valid" class="btn btn-primary">Login</button>
</form>
</div>
  `,
  providers: [FormBuilder]
})
export class App {
  name:string;
  form: FormGroup;
  constructor(private fb: FormBuilder) {
    this.name = 'Angular2'
    this.registerForm=this.fb.group({
        user:this.fb.group({
          username:['',Validators.required]
        }),
        password:['',Validators.required]
    });
  }

  logOut(x: any) {
    for(var i = 0; i < x.length; ++i) {
      console.log(x[i]);
    }
  }

  dologin(stuff: any) {
    console.log(stuff);
  }
}

@NgModule({
  imports: [ BrowserModule, ReactiveFormsModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

import {ReactiveFormsModule, FormsModule, FormGroup, FormBuilder, FormControl, Validators} from "@angular/forms";

@Component({
  selector: 'my-app',
  template: `
    <div class="login">
<form [formGroup]="registerForm" (ngSubmit)="dologin(form.value)">
 <div class="form-group" formGroupName="user" id ="user">
    <div class="form-group">
        <label for="username">Username</label>
        <input id="username" type="text" class="form-control" name="username" formControlName="username">

        <div *ngIf="registerForm.controls.user.controls.username.valid || registerForm.controls.user.controls.username.pristine"
        class="alert alert-danger"> Username is required.</div>
    </div>
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input id="password" type="password" class="form-control" name="password" formControlName="password" [formControl]="registerForm.controls.password">
        <div [hidden]="registerForm.controls.password.valid || registerForm.controls.password..pristine"
        class="alert alert-danger"> Password is required.</div>
    </div>
    <button type="button" (click)="logOut([registerForm])">Check vals</button>
    <button type="submit" [disabled]="!registerForm.valid" class="btn btn-primary">Login</button>
</form>
</div>
  `
})
export class App {
  name:string;
  registerForm: FormGroup;
  constructor(private fb: FormBuilder) {
    this.name = 'Angular2'
    this.registerForm=fb.group({
        user:fb.group({
          username:['',Validators.required]
        }),
        password:['',Validators.required]
    });
  }

  logOut(x: any) {
    for(var i = 0; i < x.length; ++i) {
      console.log(x[i]);
    }
  }

  dologin(stuff: any) {
    console.log(stuff);
  }
}

@NgModule({
  imports: [ BrowserModule, ReactiveFormsModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}`enter code here`

修改组件中的form变量名为registerForm,同时导入Formcontrol

这是因为当您有一个嵌套的表单组时,您需要将它包含到您的 属性 路径中。您没有带有路径的表单控件:

registerForm.controls['username']

但应该是:

registerForm.controls.user.controls.username

这可能会变得相当长,所以你可以考虑制作一个对应于这个表单控件的变量,这样模板看起来会更干净。但这只是一个细节:)

PLUNKER

请尝试以下更改

<div *ngIf="registerForm.get('user.username').hasError('required') && registerForm.get('user.username').touched"
        class="alert alert-danger"> Username is required.</div>

并显示密码错误

<div *ngIf="registerForm.get('password').hasError('required') && registerForm.get('password').touched"
        class="alert alert-danger"> Password is required.</div>

尝试用 [formGroup]=registerForm.controls['user'] 替换:formGroupName="user" 当您尝试隐藏验证消息时,请使用:[hidden]="registerForm.controls['user'].controls.username.valid" 而不是:<div [hidden]="registerForm.controls['username'].valid"

希望这对您有所帮助:)