组件可以调用自毁事件

Sum*_*wal 18 angular2-components angular

我有一个父组件,它在点击链接时打开一个新组件,这个新组件应该有一个关闭按钮,在关闭时向父发送一个关闭消息并销毁自己.

我们可以使用ngOnDestroy方法发送结束消息,但是如何调用子组件的销毁.

<parent>
    <child></child> //child to be opened on click but close 
                    //event should be inside the child componenet
</parent>
Run Code Online (Sandbox Code Playgroud)

如果我在这里遇到一些概念错误,请纠正我.谢谢

Gün*_*uer 29

如果添加使用分量ViewContainerRef.createComponent()等所示角2个动态卡口与用户点击选择部件,然后当你通过该组件可以破坏本身cmpRef到所创建的组件.

否则我不认为有办法.您可以将值传递给父级,以便*ngIf删除组件.

<child *ngIf="showChild" (close)="showChild = false"></child>
Run Code Online (Sandbox Code Playgroud)
class ParentComponent {
  showChild:boolean = true;
}
Run Code Online (Sandbox Code Playgroud)
class ChildComponent {
  @Output() close = new EventEmitter();

  onClose() {
    this.close.emit(null);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是这个问题的答案。这是一个组件,让知道父级何时删除它。当删除发生时,它在父范围内......这不是用户要求的自毁(我来这里是为了什么)。 (5认同)
  • 这是一个很好的解决方案,几天前我也需要这样的东西,我做的完全一样.不要认为目前有更好的方法来实现这一目标. (2认同)

Ark*_*osh 13

这是另一种方法。这在组件本身内起作用;无需与外部组件通信。

// imports
export class SelfDestroyableComponent implements OnInit {
    // other code

    constructor(private host: ElementRef<HTMLElement>) {}

    // whatEver function name you want to give 
    onCloseClicked() {
        this.host.nativeElement.remove();
    }

    // other code
}
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,它不会调用“ngOnDestroy”。并且,如果侦听器以“HostListener”启动,则它也不会被删除。没有自动“取消订阅”。 (3认同)

Ser*_*iug 12

不确定这种解决方案的清洁度,但我用过:

this.viewContainerRef
    .element
    .nativeElement
    .parentElement
    .removeChild(this.viewContainerRef.element.nativeElement);
Run Code Online (Sandbox Code Playgroud)

  • 这有点令人毛骨悚然,但确实有效,并且似乎比公认的答案更合适。 (6认同)
  • 它会让它消失,但 ngOnDestroy 钩子没有被调用,所以不正确 (6认同)