提问者:小点点

在Angular 8中点击按钮时多次调用Subscribe()方法


由于一个问题,我在开发Angular 8应用程序时被卡住了。UI上有两个按钮。当我点击一个按钮时,一个事件被触发,它为我提供了它在数组packageHeaders中的索引位置。

<p-tabView (onChange)="tabChange($event)">
          <p-tabPanel *ngFor="let tabHeader of packageHeaders" [header]=tabHeader>
                //few html lines
          </p-tabPanel>  
</p-tabView>

根据索引,我在3-4个不同的组件中呈现包数据,并根据业务规则/要求执行计算。

为了使所选索引在所有组件中可用,我在服务类中声明了一个Be行为主题并将索引传递给它。然后,我将其释放为可观察的,以便我的组件可以订阅它。下面是服务类代码片段:

public tabIndex = new BehaviorSubject<number>(0);

findTabClicked(changeInTabSelection: number) {
    this.tabIndex.next(changeInTabSelection);
  }

  getSelectedTab(): Observable<number> {
    return this.tabIndex.asObservable();
  }

在我的组件中,我订阅它以获取最新的选定值。例如:

 this.service.getSelectedTab().subscribe((selectedTabIndex) => {
      this.packageTypeInUse(selectedTabIndex);
      this.calculateTotalOnQuantityChange(this.regularIndex[selectedTabIndex]);
    });

我也在ngOnDestroy()生命周期挂钩中取消订阅它。在模板中,我使用for循环来显示行Items*ngFor="let item of packageLineItems[tabIndex]

因此,基于此索引,我在UI上显示行项目列表。我可以修改项目值。我也可以通过单击按钮遍历到其他tabHeader。

有两个问题:

  1. 上面的Subscribe方法在所有组件中都被调用了两次。
  2. 在调试代码时,我知道,在第一次订阅时,我的数组packageLineItems[tabIndex]具有修改后的值,但在第二次订阅时它会被初始数组值覆盖。

我已经在ngOnInit()上初始化了数组。为了确定,我还验证了在更改制表符标头时,ngOnInit()没有被调用。不确定,数组是如何在第二次不需要的订阅调用时自动重置为初始值的。


共1个答案

匿名用户

最后,问题解决了。这是一个愚蠢的错误,但理解得很好。我分享的超文本标记语言片段有for循环。而不是关闭html标签

<p-tabPanel *ngFor="let tabHeader of this.packageHeaders" [header]=tabHeader></p-tabPanel>

这就是为什么组件被多次初始化并且与订阅者相同的原因。