使BehaviorSubject在浏览器选项卡之间持久存在? (@HostListener?)

时间:2019-06-20 19:49:20

标签: angular events rxjs local-storage behaviorsubject

我们有一个Angular 6应用,该应用由类似Excel的网格组成。当用户更新一个网格时,myFunction()运行,并且从另一个组件运行,我们需要能够判断myFunction()是否仍在进行中。

我找到了使用RXJS BehaviorSubject的解决方案。然后,我意识到该解决方案不会在浏览器选项卡之间持久化(因为每个选项卡都是其自己的Angular实例)。这是一个问题,因为用户可能在一个监视器上打开一个网格,而在另一个监视器上打开另一个网格。

因此,我找到了此@HostListener解决方案https://stackoverflow.com/a/45638992/6647188,但是我不知道如何将我的BehaviorSubject逻辑转换为该策略。也许除了localStorage之外,还有保存和订阅@HostListener的替代方法,所以我不必使用事件吗?否则,我可以尝试将@HostListener与我自己的自定义手动发出的事件一起使用,尽管我也不知道该怎么做。我的代码:

组件1(US Dollars grid):

myFunction() {
     self.myService.isFunctionStillRunningBehaviorSubject.next(true);
     this.get(path).subscribe (
         data = > {  
           self.myService.isFunctionStillRunningBehaviorSubject.next(false); 
         }
     );
}

组件2(Euros grid):

public subscription;

ngOnInit() {
    this.myService.isFunctionStillRunningObservable.subscribe(
        data => {
            if (data === true) {
                console.log("myFunction() is still running!");
            }
        }
    );
}

我的服务:

import { Observable, BehaviorSubject } from 'rxjs';

public isFunctionStillRunningBehaviorSubject = new BehaviorSubject<boolean>(null);

public isFunctionStillRunningObservable = this.isFunctionStillRunningBehaviorSubject.asObservable();

即使使用localStorage,我仍然无法确定该功能是否在进行中,如果它是由其他人在另一台计算机上启动的,但是就每个用户而言,localStorage可能就足够了。

1 个答案:

答案 0 :(得分:2)

如果需要在两个单独的浏览器(两个不同的人)之间进行通信,则可能需要研究使用某种类型的Socket通信。对于Node,它类似于SocketIO。如果您的后端位于C#中,则可能SignalR