Angular docsと同じ方法でアクセスできないため、最初に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>
未定義のプロパティ「無効」を読み取ることができません
form.component:
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),
});
}
username
またはpassword
という変数がないため、エラーがスローされます。
これを解決するために、次のことができます。
export class SignUpComponent implements OnInit {
myForm: FormGroup;
usernameCtrl: FormControl;
passwordCtrl: FormControl;
ngOnInit() {
this.usernameCtrl = new FormControl('username', Validators.required);
this.passwordCtrl = new FormControl('', Validators.required);
this.myForm = new FormGroup({
username: this.usernameCtrl,
password: this.passwordCtrl
});
}
}
...または FormBuilder
を使用:
export class SignUpComponent implements OnInit {
myForm: FormGroup;
usernameCtrl: FormControl;
passwordCtrl: FormControl;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.usernameCtrl = this.formBuilder.control('username', Validators.required);
this.passwordCtrl = this.formBuilder.control('', Validators.required);
this.myForm = this.formBuilder.group({
username: this.usernameCtrl,
password: this.passwordCtrl
});
}
}
これで、次のようにテンプレートで直接使用できます。
<div class="alert alert-danger" *ngIf="usernameCtrl.invalid">
username is required
</div>
また、formControlName
の代わりに[formControl]
を使用することもできます:
<input
type="text"
name="username"
class="form-control"
[formControl]="usernameCtrl">
この問題は、フォームグループを使用して、コントローラーで対応するゲッターを定義することで解決できます。この目標を達成するには:
コントローラ内:
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)forcontrolName = usernameの[formControl] = "usernameCtrl"および* ngIf = "username.invalid"の* ngIf = "usernameCtrl.invalid"を変更します
<input type="text"
name="username"
class="form-control"
formControlName="username">
<div *ngIf="username.invalid" class="alert alert-danger">
username is required
</div>
3)forcontrolName = passwordの[formControl] = "passwordCtrl"および* ngIf = "password.invalid"の* ngIf = "passwordCtrl.invalid"を変更します。
<input type="text"
name="password"
class="form-control"
formControlName="password">
<div *ngIf="password.invalid" class="alert alert-danger">
password is required
</div>
私の作品:
form.component:
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>