typescript - Angular - Interagovať s reaktívnymi formulármi detských komponentov


Mám registračnú súčasť, ktorá má ng-switch komponentov

<ion-component>
  <ng-container [ngSwitch]="registrationStage">
    <step1 *ngSwitchCase="1"></step1>
    <step2 *ngSwitchCase="2"></step2>
    <step3 *ngSwitchCase="3"></step3>
  <ng-container>
</ion-component>

<ion-footer>
  <button (click)="goForward()">
  </button>
</ion-footer>

registračný komponent

  private goForward(): void {
    if (this.section !== 5) {
      switch (this.section) {
        case 1:
          this.step1.nextStep(); // <---cannot read property invalid of undefined
          this.regService.goForward();
          break;

        default:
          break;
      }
    } else {
      return;
    }
  }

komponent kroku 1

export class Step1 {
  private regForm: FormGroup;
  private formBuilder: FormBuilder;
  private stepTwo = false;

  public constructor(formBuilder: FormBuilder) {
    this.formBuilder = formBuilder;
  }
  public ngOnInit(): void {
    console.log('loaded'); //<-- I see this in the console

    this.regForm = this.formBuilder.group(
      {
        email: ['', [Validators.required, Validators.email]],
        password: ['', [Validators.required, Validators.minLength(6)]],
        confirmPassword: ['', Validators.required],
      },
      {
        validator: MustMatch('password', 'confirmPassword'),
      },
    );
  }
  public verifyAndNextStep(): void {
    this.stepTwo = true;

    if (this.regForm.invalid) {
      return;
    }
    const emailPassword: EmailPassword = {
      email: this.regForm.value.email,
      password: this.regForm.value.password,
    };
    this.regService.setEmailAndPassword(emailPassword);
    this.regService.goForward();
  }

problém je v tom, že dostávam chybu: ERROR TypeError: Cannot read property 'invalid' of undefined ukazujúcu na volanie funkcie hore. Ďalej sa zdá, že FormGroup sa neinicializuje?

Nie som si presne istý, čo je problém, pozrel som si aj iné príspevky o tom:

jeden

dva

STACK BLITZ

Odpoveď č. 1

Namiesto získavania komponentu z pohľadu ho vkladáte priamo takto

  public constructor(navCtrl: NavController, step1: StepOne) {
}

Takáto súčiastka bude 'obyčajným objektom' bez zapojenia životného cyklu komponentu Angularu. Preto sa v Step1 nevolá ngOnInit, takže sa nevytvorí žiadny formulár, a preto je form nedefinovaný

Čo by ste mali urobiť, namiesto injekcie cez konštruktor použite @ViewChild, aby ste získali skutočnú komponentu zo stránky.

Toto opravuje váš problém (aspoň v kroku 1, nič iné som nekontroloval)

 @ViewChild(StepOne)
  private step1: StepOne;
  private navCtrl: NavController;
  public constructor(navCtrl: NavController) {
      this.navCtrl = navCtrl;
  }

https://stackblitz.com/edit/ionic-quz7y3?file=pages/home/home.ts

Odpoveď č. 2

nahraďte (this.regForm.invalid) za (this.regForm.status === 'INVALID').

formbuilder nemá vlastnosť Neplatné/Platné vložte popis obrázka sem