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

Posted

技术标签:

【中文标题】如何在没有 ComponentFactory 的情况下销毁 Angular 2 组件?【英文标题】:How do you destroy an Angular 2 component without a ComponentFactory? 【发布时间】:2017-01-09 22:20:45 【问题描述】:

当通过 ComponentFactory 动态创建组件时,返回的 ComponentRef 提供了一个 destroy 方法,该方法非常适合我想要完成的工作。考虑到这一点,看起来我需要做的就是为静态创建的组件获取一个 ComponentRef,然后使用它的销毁函数(this answer 状态),但是当我尝试这个时,我得到一个错误,说“销毁不是函数”,即使我确实得到了一个对象。

这是我用于 ViewChild 的语法:

@ViewChild(MyComponent) myComponentRef: ComponentRef<MyComponent>;

还有我的“毁灭”号召:

private destroy() 
    this.myComponentRef.destroy();

这里触发:

<button (click)="destroy()">Destroy</button>

调用这个“销毁”方法适用于我动态创建的组件,但不是静态的。

编辑:所以看起来这确实部分删除了组件,但没有从 DOM 中删除,这与在动态创建的组件上调用“destroy”时发生的行为不同。此外,当我点击我试图销毁的组件时,我的点击事件函数仍然会触发。

编辑 2:我更新了 ViewChild 语法以显式读取 ComponentRef 并得到“未定义”返回:

@ViewChild(MyComponent, read: ComponentRef) myComponentRef: ComponentRef<MyComponent>;

如果返回“未定义”,那么我猜这可能是不可能的。

【问题讨论】:

你可以使用 *ngIf 指令动态删除组件吗? 这里是 Angular 组件生命周期钩子页面 angular.io/guide/lifecycle-hooks @badger2013 您使用哪些资源来查找有关 ComponentFactory 的文档? medium.com/@Carmichaelize/… - 对我来说是新的。 利用angular.io/api/core/OnDestroy 【参考方案1】:

您可以在组件的容器中添加 *ngIf,并在条件 (ngif) 的基础中添加子元素的销毁和创建。示例:

在视图中:

<div *ngIf="destroy">
    <component-child></component-child>
</div>
<button (click)="destroyFunction()">Click to Destroy</button>

在组件父类中:

//Declare the view child
@ViewChild(componentChild) componentChild: componentChild;

//Declare the destroy variable
destroy:boolean;

//Add a function to change the value of destroy (boolean)
public destroyFunction()
    this.destroy = false;

执行这些步骤,您可以执行子元素的销毁。我希望它对你有效

【讨论】:

我添加了 *ngIf,而不是属性,我创建了一个方法,并且我的 ngIf 在我的组件标签上而不是 div 上。我的组件在 mat-tabs 中。切换选项卡时,我正在通过我的函数相应地设置 ngIf。但是当回到标签时,我可以看到旧的结果。似乎组件没有以这种方式被破坏。

以上是关于如何在没有 ComponentFactory 的情况下销毁 Angular 2 组件?的主要内容,如果未能解决你的问题,请参考以下文章

我想实现安卓手机拍照后,照片自动同步到局域网没电脑。没有外网的情

烽火exmobile--ios原生插件开发

即时渲染复杂的结构化组件

如何在 spyder 中恢复未保存的文件

winform程序APPCRASH,KERNELBASE.dll错误

既然文字表你心,如何用深度学习读懂你的情?