17

无法以与 Angular 文档中相同的方式访问它,因此必须先获取 FormGroup 实例并在其中找到 FormControl 实例。我想知道为什么?这个例子有效:

<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
  <div class="form-group">
    <label for="username">Username</label>
    <input 
      type="text"
      name="username"
      class="form-control"
      formControlName="username"
    >
    <div *ngIf="myForm.controls.username.invalid" class="alert alert-danger">
      username is required
    </div>
  </div>

虽然这会引发错误(仅在 *ngIf 语句中存在差异):

<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
  <div class="form-group">
    <label for="username">Username</label>
    <input 
      type="text"
      name="username"
      class="form-control"
      formControlName="username"
    >
    <div *ngIf="username.invalid" class="alert alert-danger">
      username is required
    </div>
  </div>

无法读取未定义的属性“无效”

表单组件:

import {Component} from '@angular/core';
import {FormGroup, FormControl, Validators} from '@angular/forms';

@Component({
  selector: 'sign-up',
  templateUrl: 'app/sign-up.component.html'
})

export class SignUpComponent {

  myForm = new FormGroup({
    username: new FormControl('username', Validators.required),
    password: new FormControl('', Validators.required),
  });
}
4

6 回答 6

26

它会引发错误,因为您没有名为usernameor的变量password

为了解决这个问题,您可以:

  1. 将控件存储在组件变量中:

TS

@Component({
  changeDetection: ChangeDetectionStrategy.OnPush,
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent {
  readonly usernameCtrl = this.formBuilder.control('username', Validators.required);
  readonly passwordCtrl = this.formBuilder.control('', Validators.required);
  readonly formGroup = this.formBuilder.group({
    username: this.usernameCtrl,
    password: this.passwordCtrl
  });

HTML

<div 
  *ngIf="userNameCtrl.invalid" class="alert alert-danger"
>
  username is required
</div>
  1. 用于AbstractControl#get抓取控件:

HTML

<div 
  *ngIf="formGroup.get('username').invalid" class="alert alert-danger"
>
  username is required
</div>
  1. 使用AbstractControl#hasError这样您就可以为每个现有的验证指定不同的消息:

HTML

<div 
  *ngIf="formGroup.hasError('required', 'username')" class="alert alert-danger"
>
  username is required
</div>

演示

于 2017-06-17T01:20:38.067 回答
11

您可以使用表单组并在控制器中定义相应的 getter 来解决此问题。为了实现这个目标:

在控制器中:

1) 去掉表单控制变量的定义和初始化

usernameCtrl: FormControl;
passwordCtrl: FormControl;
...
this.usernameCtrl = this.formBuilder.control('username',Validators.required);
this.passwordCtrl = this.formBuilder.control('', Validators.required);

2)将表单组初始化更改为此

ngOnInit() {
this.myForm = this.formBuilder.group({
  username: ['usename', Validators.required]
  password: ['', Validators.required]
});

}

3)添加吸气剂

get username() { return this.myForm.get('username'); }
get password() { return this.myForm.get('password'); }

在模板中:

1) 添加带有 [formGroup]="MyForm" 的父 div

<div [formGroup]="myForm">
...
</div>

2) 更改 [formControl]="usernameCtrl" 为 forcontrolName=username 和 *ngIf="usernameCtrl.invalid" 为 *ngIf="username.invalid"

<input type="text"
       name="username"
       class="form-control"
       formControlName="username">
  <div *ngIf="username.invalid" class="alert alert-danger"> 
    username is required
  </div>

3) 更改 [formControl]="passwordCtrl" 为 forcontrolName=password 和 *ngIf="passwordCtrl.invalid" 为 *ngIf="password.invalid" te。

<input type="text"
       name="password"
       class="form-control"
       formControlName="password">
  <div *ngIf="password.invalid" class="alert alert-danger">
    password is required
  </div>

普朗克

于 2018-01-08T11:55:23.517 回答
6

对我来说工作:

表单组件:

getFormControl(name) {
    return this.Form.get(name);
}

模板:

<input 
  type="text"
  name="username"
  class="form-control"
  formControlName="username"
>
<div *ngIf="getFormControl('username').invalid" class="alert alert-danger">
  username is required
</div>
于 2018-11-30T08:35:15.487 回答
1

我遇到了同样的问题,我将“this”添加到“myForm.controls ....”中。它帮助了我。

代替:

<div *ngIf="myForm.controls.username.invalid" class="alert alert-danger">
      username is required
 </div>

做:

 <div *ngIf="this.myForm.controls.username.invalid" class="alert alert-danger">
      username is required
 </div>

希望这对您有所帮助。

于 2020-09-29T09:38:28.020 回答
1

在 ts 文件中添加:

get username() { return this.myForm.get('username'); }
get password() { return this.myForm.get('password'); } }
于 2020-10-26T13:41:41.870 回答
1

实际上我只是 Angular 的新手,我只用了一个月,还在寻找一些答案,呵呵,但是在你的组件中添加一个像这样的 getter:

export class SignUpComponent {

 myForm = new FormGroup({
    username: new FormControl('', Validators.required),
    password: new FormControl('', Validators.required),
  });

get username(){
  return this.myForm.controls['username'];
}

}
于 2020-12-28T01:26:49.140 回答