【问题标题】:Complete Output() eventemitter in ngOnDestroy callback在 ngOnDestroy 回调中完成 Output() 事件发射器
【发布时间】:2019-04-19 21:52:35
【问题描述】:

在我的 Angular 组件的 ngOnDestroy 回调中为每个 Output() EventEmitter 调用 complete() 方法是一种好习惯吗? 这样,当组件被销毁时,对这些输出的任何订阅都会直接结束。而且在大多数情况下,我不必再担心在父组件中取消订阅。你怎么看?

示例

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

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

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

【问题讨论】:

标签: angular


【解决方案1】:

好吧,我个人觉得在@OutputEventEmitter 上拨打complete() 并不是真的必要。我这么说是因为我们可以从子组件调用emit

这类似于不对从HttpClient 返回的Observable Subscription 调用unsubscribe,以防它只被调用一次。

这是一个amazingly enlightening article by Ben Lesh,他是 Rxjs 的负责人。阅读本文将清楚何时unsubscribe 何时不使用。

您可以考虑在类似的线路上调用complete() 的想法。

更新:

您添加的示例展示了一个极其罕见的用例,当 ChildComponent 在父组件 Typescript 类中使用时,可能使用 ViewChild 并且它的事件在父组件中被监听。在这种特殊情况下,我认为unsubscribengOnDestroy 中很重要。

但在大多数情况下,子组件的@Output 事件通常由父组件中的处理程序监听。从子组件触发的事件通常在我们手中。如果子组件被销毁,那么它不会真正触发任何事件,所以我认为没有必要在ngOnDestroy 中显式调用completeunsubscribe

【讨论】:

  • 感谢您的回复和精彩的文章。我了解取消订阅父组件是我们的责任。我用一个例子更新了我的问题。在这个例子中你会采用哪种方法?
  • 确实,在我的场景中,父级是一个列表组件,子级是@ContentChildren 检索到的列表项。由于我使用的是虚拟滚动,因此当我滚动时,孩子们会不断地被破坏和重新创建。如果我没有在项目被销毁后立即结束订阅。我最终可能会收到数百个“被动”订阅(对于已经销毁的项目),这些订阅只有在我的列表组件被销毁时才会结束。因此,我最初的问题是在组件ngOnDestroy 中完成子EventEmitter。所以这对这种特殊情况有意义吗?谢谢!
  • @dalox,是的。这完全有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多