Angular FormGroup 在本地方法中未定义

Angular FormGroup is undefined inside a local method

我有 2 个并行组件,我正在尝试将 1 个组件注入其他组件。以下是我的组件文件:

RegisterComponent.html

<mat-tab #tab label="Contact Details">
  <ng-template matTabContent>
    <app-contact-details></app-contact-details>
  </ng-template>
</mat-tab>

<button type="button" (click)="changeTabOrStepViaContinue()" class="">Continue</button>

RegisterComponent.ts

changeTabOrStepViaContinue() {
    if (this.tabGroup._tabs.first.isActive) {
      this.tabGroup.selectedIndex += 1;
    } else if (this.tabGroup._tabs.last.isActive /* &&  this.isContactFormValid() */) {
        this.contactDetails.validateContactDetails(); //throws Error
      console.log("Contact details form: ", this.contactDetailsForm);
    } else if (this.isPersonalDetailsFormValid()) {
        this.tabGroup.selectedIndex += 1;
    }
  }

ContactDetailsComponent.ts(正在注入的组件)

ngOnInit() {
    console.log("Contct det ngOnInit fired......")
    this.contactDetailsForm = this.formBuilder.group({
      primaryMobile: ['', [Validators.required]],
      primaryMobileOwner: ['', [Validators.required]],
      primaryEmail: ['', [Validators.required]],
      primaryEmailOwner: ['', [Validators.required]],
      landLine: [''],
      country: ['', [Validators.required]],
      pinCode: ['', [Validators.required]],
      flat: ['', [Validators.required]],
      street: [''],
      postOffice: ['', [Validators.required]],
      locality: ['', [Validators.required]],
      district: ['', [Validators.required]],
      state: ['', [Validators.required]]
    })
}

validateContactDetails(): boolean {
    console.log(this.contactDetailsForm);
    Object.keys(this.contactDetailsForm.controls).forEach(elt => {
      this.contactDetailsForm.get(elt).markAsTouched();
    })
    if (this.contactDetailsForm.valid) {
      this.contactDetails.emit(this.contactDetailsForm);
      return true;
    }
    return false;
  }

我通过包含 @Injectable({providedIn:'root'}) 使 ContactDetailsComponent 成为一项服务,并将其作为 constructor(private contactDetails:ContactDetailsComponent) 注入到 RegisterComponent 的构造函数中。

当我 select 特定的 mat-tab 时,ContactDetailsComponent 的 ngOnInit 被触发(它是在 ng-template 内部延迟加载的)但是点击继续按钮时,它显示了一个错误 TypeError: Cannot read property 'controls' of undefined

为什么 FormGroup undefined 在局部函数中?

更新

我安慰 ContactDetailsComponentthis 上下文,发现它没有 contactDetailsForm 属性。然后我将变量声明从 contactDetailsForm:FormGroup 更改为 contactDetailsForm:FormGroup=new FormGroup({}) 然后它在 this 上注册但是在 ngOnInit 中对 FormControls 进行的验证不再起作用。我还向组件添加了另一个 FormGroup,并且发生了同样的事情。看起来 this 只是在注册已初始化的属性,但我不确定为什么会这样。

您是否尝试从 parent 调用 child 方法?

据我所知,您不需要注入任何东西,除非在您没有告诉我们的其他地方需要它。您可以只向 app-contact-details 添加一个 id 并使用 ViewChild 来获取引用。有多种使用 ViewChild 的方法,这一种可能不是最适合您的方法,但它只是一个示例。

<app-contact-details #contactDetail></app-contact-details>

@ViewChild('contactDetail') contactDetail: ContactDetailsComponent; // In the parent ts file

然后,如果您想查看它是否已初始化,请检查 parent 的 ngAfterViewInit,您应该可以在其中访问 children 函数(您可能需要将 contactDetail 转换为你的组件类型,或者你不同的 ViewChild 初始化)如果它们是 public 因为此时 children 的 OnInit 应该被调用。

  ngAfterViewInit() {
     // you can try to print your form
  } 

您的表单未初始化的原因是您没有引用正确的实例,除非组件是单例。使用内容投影(就像你正在做的那样)组件将在 angular 开始显示它时立即初始化(这是在 child 中调用 OnInit 的地方)。