angular – 在ngOnDestroy回调中完成Output()eventemitter

在我的角度组件的ngOnDestroy回调中为每个Output()EventEmitter调用complete()方法是一个好习惯吗?

这样,当组件被销毁时,对这些输出的任何订阅都将直接结束.在大多数情况下,我不必担心在父组件中取消订阅.你怎么看?

我有一个父组件,订阅子组件的输出事件.
我通常这样做:

childCompoment.event.pipe(
    takeUntil(this.parentComponentDestroyed$), // end subscription when parent is destroyed
  ).subscribe((eventData: any) => {
    // do stuff
  });
}

现在,如果子组件被销毁,则不会自动结束我的父订阅.我必须等到父组件被自行销毁.
如果我在子组件的OnDestroy回调中调用event.complete(),那么我的订阅将在子组件被销毁后立即结束.
在这种情况下,最好的方法是什么?

最佳答案 好吧,我个人认为没有必要在@Output EventEmitter上调用complete().我是这么说的,因为我们应该从Child Component调用emit.

它类似于在HttpClient返回的Observable Subscription中调用unsubscribe,只要它被调用一次.

这是一个amazingly enlightening article by Ben Lesh谁是Rxjs领先.阅读本文将清楚说明何时取消订阅以及何时取消订阅.

你可以考虑在类似的行上调用complete()的想法.

更新:

当您在Parent Component Typescript类中使用ChildComponent时,您添加的示例展示了极为罕见的用例,可能使用ViewChild,并且在Parent Component中侦听了它的事件.在这种特殊情况下,我认为在ngOnDestroy中取消订阅非常重要.

但在大多数情况下,子组件的@Output事件通常由父组件中的处理程序监听.从儿童组件发射的事件通常掌握在我们手中.如果子组件被销毁,那么它将不会真正触发任何事件,因此我并不认为有必要在ngOnDestroy中显式调用完成或取消订阅.

点赞