【问题标题】:Multiple Subscriptions Happening on Button Click按钮单击时发生多个订阅
【发布时间】:2025-12-23 08:10:11
【问题描述】:

我有一个包含项目列表的组件,其中,在每个项目中,一个按钮允许用户删除所述项目。

单击delete 按钮后,将打开一个模式,确认是否要删除该项目。单击delete 按钮时,会触发以下函数:

public removeSite(site: site): void {
    this.deleteSiteModal.open(site);

    site.siteDeletion = true;

    this._subscriptions.push(this.deleteSiteModal.siteToDelete.subscribe((siteToDelete) => {
        if (siteToDelete) {
            this._subscriptions.push(this.myService.deleteSite(siteToDelete.guid).subscribe(sites => {
        }
    }));
}

最终发生的情况是,每次单击此按钮时,都会发生多个订阅,从而导致发送多个请求。一个项目将被删除,然后它会尝试再次删除相同的项目,但由于找不到它而失败。

我的同事提到我应该在我的组件之外订阅一次siteToDelete,并且只在单击按钮时执行操作。

对此有何想法或解决方法?

谢谢

【问题讨论】:

  • 当用户确认删除时,this.deleteSiteModal.siteToDelete 会发出吗?为什么要对siteToDelete进行真实检查?你在订阅myService.deleteSite做些什么吗?
  • 是的。不完全确定(该组件已被多个开发人员修改)。实际删除站点的其余逻辑都在那里,但我只是决定暂时将其保留(它只是数组上的过滤器)。
  • 当模态关闭时您是否取消订阅?
  • 我在我的ngOnDestroy取消订阅
  • 父组件的ngOnDestroy还是modal?如果您在模态关闭时没有取消订阅,那么您的订阅将会增加(每次调用 removeSite 时都会增加 1),并且您会收到越来越多的删除 api 调用。

标签: angular rxjs


【解决方案1】:

我同意你同事的观点。组件不应该担心实际删除站点。组件的工作是从输入和服务中获取信息以显示给用户,并将用户输入引导到输出和服务。话虽这么说,从已完成的模态中获取信息并将它们传递出去是一个灰色地带,我不会立即忽视它。不过,我认为可能有两个更好的选择。

您的模态组件应该直接调用某个站点管理服务的删除方法,或者某个站点管理服务应该订阅siteToDelete

【讨论】: