Angular 2 - 销毁子组件

Posted

技术标签:

【中文标题】Angular 2 - 销毁子组件【英文标题】:Angular 2 - destroy child component 【发布时间】:2016-12-05 05:51:33 【问题描述】:

我从 Angular 2 开始,我初始化了一个子组件“ChildCmp”,在我需要通过单击销毁组件之后,可以说:

@Component(
selector: 'main-cmp',
templateUrl: './main-cmp.html',
directives: [ChildCmp]
)
class MainCmp 
    @ViewChild(ChildCmp)
    childCmp: ChildCmp;
    destroyChildClick()
        this.childCmp.destroy();
    

但是前面的代码没有运行,destroy() 是未定义的,异常是:

TypeError: this.childCmp.destroy 不是函数

我已阅读this thread 并且正在使用 ViewContainerRef.createComponent(),使用它创建的组件是 "ComponentRef" 的一个实例,但 childCmp 没有'没有“ComponentRef”实现。

如何实现或注入destroy方法?

谢谢大家!

【问题讨论】:

显示您在何处以及如何创建组件? 既然可以*ngIf,为什么要销毁? @Harangue 我正在使用 ViewContainerRef.createComponent() 动态创建组件,其他组件是从模板创建的,因此我需要一个表单来销毁。 @micronyks,ChildCmp 没有什么特别之处,MainCmp 被传递给bootstrap 方法,我唯一想要的是在我销毁组件时触发事件(处理对象并避免内存泄漏)。 这样你就不能破坏它了。您可以销毁使用viewContainerRef.createComponent() 创建的组件的实例。所以再次询问您是如何创建它的? 【参考方案1】:

简答

export class MainCmp 

   @ViewChild(ChildCmp) childRef: ChildCmp;

   destroyClick() 
      this.childRef?.destroy();
   

我知道上面的代码在正常情况下没有意义,我不会使用它,但由于我没有上下文,我根据给定的问题回答。父级应该先检查子引用是否被定义,然后才能销毁子引用。

更好的方法是使用NgIf 来销毁子组件,但我还是不知道上下文或用例。

@Component(
  selector: 'main-cmp',
  template: `
    <child-cmp *ngIf="childDestroyed"></child-cmp>
    <button (click)="childDestroyed = true">Destroy child</button>
  `,
)
class MainCmp 
  childDestroyed: boolean;

【讨论】:

这没有意义。 我认为这不能回答 OP 的问题。另外,这里写的对我来说没有意义。无论如何,当父组件被销毁时,子组件也会被销毁。无论this.childRef.destroy() 是否有效,您基本上都是在呼吁在孩子被销毁之前将其销毁。 @freethebees 没有人说你需要手动销毁孩子,但人们可能想为这么多不同的用例销毁孩子。如果你想保留父母并摧毁孩子怎么办? @MurhafSousli OP 要求手动销毁孩子:“通过单击销毁组件”。如果您暗示您的代码允许您保留父母并摧毁孩子,我不同意。仅当 MainCmp 被销毁时,您的代码才会运行 this.childRef.destroy() 我刚刚将ngOnDestroy()重命名为destroyClick(),重要的是如何从组件代码中手动销毁它

以上是关于Angular 2 - 销毁子组件的主要内容,如果未能解决你的问题,请参考以下文章

Angular2子组件在ngFor中意外销毁

如何在没有 ComponentFactory 的情况下销毁 Angular 2 组件?

当组件被销毁时,Angular 如何销毁事件处理程序和属性绑定

Angular完全销毁动态创建的组件

如何销毁父组件内的子组件

Angular 组件在被销毁后仍在监听订阅 [重复]