角度:无法读取 NgbModal 的 ng-template 内未定义的属性'sendClassForm'



好吧,首先,我已经疯狂地搜索了这个问题并找到了一些解决方案(一些在这里解释了(,但没有一个解释有效的方法。所以,我来了...

这是关于什么的

我正在创建一个使用 ng-bootstrap 的模态。我制作了一个表单的组件,以便在其他页面中重用它。我把这个组件放在模态中。我需要从父组件访问此组件的变量和方法,因此我在父组件的组件中设置了一个 ViewChild 变量并将其设置为子组件。

当我打开模态时,组件显示没有问题。当我单击"创建"按钮时,问题就出现了。当用户单击"创建"按钮时,父项(包含模态(执行子项的方法以发送表单,但父项无法访问子项的方法,因为它未定义,即使模态已打开。

我已经尝试过的内容

我尝试将 Child 组件放在 ng 模板之外,它工作得很好,但我需要在模态中使用它。

我还尝试将带有指令 #id 的组件传递给父级的方法,以便执行子级的方法。它可以工作,但会使代码更脏,并在将来带来更多问题。(这实际上是我未来的我在这个实现中遇到了更多问题。

如果有人想知道它带来了什么样的问题,我需要将更多组件嵌套到子组件中,所以,因为这个"孙子"组件它仍然在 ng 模板中,问题重复出现,现在我必须再次使代码更脏......

代码(堆栈闪电战应用程序(

这是我制作的Stackblitz应用程序。我保持它非常简单,并排除了与问题无关的不必要的代码部分。 堆栈闪电应用

我收到的消息错误

这是我收到的错误消息:

ERROR TypeError: Cannot read property 'sendClassForm' of undefined

我已经读到当 ng-template 尚未呈现时(例如模式尚未打开(,您会收到这个undefined错误,但我不明白为什么当它已经打开时它仍然会发生。

角度版本:8.1.2

"@ng-bootstrap/ng-bootstrap": "^5.1.0">

多亏了坚持他的解决方案的@yurzui,我想出了另一个解决方案,我认为它几乎与拥有 ViewChild 相同,但没有问题。

这是Stackblitz代码,如果你想立即看到它,而不是我的解释。

堆栈闪电应用

父组件

我设置了一个属性,与 ViewChild 相同,但删除了 ViewChild 部分。

classFormComponent: ClassFormComponent; // No 'ViewChild(...)' part

并且还创建了一个方法,用于在需要时将子组件的引用保存到上面的变量中。

// This method will be called by the ClassFormComponent when it gets ready to be used by the Parent.
saveReference( classFormComponent: ClassFormComponent ) {
this.classFormComponent = classFormComponent;
}

父网页

然后,我将侦听器设置为app-class-form这样当孩子准备好时,它可以通过调用上面解释的父方法告诉父级。

<app-class-form (componentIsReady)="saveReference( $event )"></app-class-form>

子组件

子项具有输出事件发射器。

@Output() componentIsReady: EventEmitter<ClassFormComponent> = new EventEmitter();`

并且此事件在ngOnInit生命周期阶段发出。

ngOnInit() {
// At this point, child component is born and it's ready to be used by the parent.
this.componentIsReady.emit(this);
}

这样,父级就可以访问子项的方法和属性。

我说这是我的反向解决方案,因为现在孩子在准备好时到达父级,然后父级才保存对它的引用。

最新更新