web-dev-qa-db-fra.com

Impossible d'accéder directement à l'instance FormControl. Impossible de lire la propriété «non valide» de non définie

Je ne peux pas y accéder de la même manière que dans les documents Angular, donc je dois d'abord saisir l'instance FormGroup et y trouver une instance FormControl .. Je me demande pourquoi? Cet exemple fonctionne:

<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>

Bien que cela génère une erreur (différence entre ceux-ci uniquement dans l'instruction * 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>

Impossible de lire la propriété "non valide" de non définie

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),
  });
}
12

Il génère une erreur car vous n'avez pas de variable appelée username ou password.

Pour résoudre ce problème, vous pouvez procéder comme suit:

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
    });
  }
}

... ou en utilisant 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
    });
  }
}

Vous pouvez maintenant l'utiliser directement dans le modèle, comme ceci:

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

De plus, si vous préférez, vous pouvez utiliser [formControl] au lieu de formControlName:

<input 
  type="text"
  name="username"
  class="form-control"
  [formControl]="usernameCtrl">

[~ # ~] plongeur [~ # ~]

19
developer033

Vous pouvez résoudre ce problème en utilisant un groupe de formulaires et en définissant les getters correspondants dans votre contrôleur. Pour atteindre cet objectif:

Dans le contrôleur:

1) Supprimer la définition et l'initialisation des variables de contrôle de formulaire

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

2) Remplacez l'initialisation du groupe de formulaires par

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

}

3) Ajoutez les getters

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

Dans le modèle:

1) ajoutez un div parent avec [formGroup] = "MyForm"

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

2) changer [formControl] = "usernameCtrl" pour forcontrolName = username et * ngIf = "usernameCtrl.invalid" pour * 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) changez [formControl] = "passwordCtrl" pour forcontrolName = password et * ngIf = "passwordCtrl.invalid" pour * 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>

Plunker

11
Javier Rojano

Pour moi ça marche:

form.component:

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

modèle:

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