Сделать BehaviorSubject постоянным на вкладках браузера? (@HostListener?)

У нас есть Angular 6 приложение, состоящее из таблиц, подобных Excel. Когда пользователь обновляет одну сетку, запускается myFunction(), а из другого компонента мы должны иметь возможность определить, выполняется ли еще myFunction() или нет.

Я нашел решение, используя RXJS BehaviorSubject. Затем я понял, что это решение не сохраняется на вкладках браузера (поскольку каждая вкладка является собственным экземпляром Angular). Это проблема, поскольку у пользователей может быть открыта одна сетка на одном мониторе, а другая — на другом.

Итак, я нашел это решение @HostListener https://stackoverflow.com/a/45638992/6647188, но не могу выяснить, как перевести мою логику BehaviorSubject на эту стратегию. Возможно, кроме @HostListener есть альтернативы сохранению и подписке на localStorage, чтобы не использовать событие? В противном случае я мог бы попробовать использовать @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 может быть достаточно адекватным.


person Kyle Vassella    schedule 20.06.2019    source источник
comment
Когда вы говорите через вкладки, вы имеете в виду вкладки браузера? Или вкладки в вашем угловом приложении, похожие на MaterialTabs, такие как - material.angular.io/components/tabs/overview . Если это вкладка браузера, обновите свой вопрос, чтобы избежать путаницы.   -  person user2216584    schedule 20.06.2019
comment
Вкладки браузера, спасибо :)   -  person Kyle Vassella    schedule 20.06.2019
comment
В этой статье есть несколько идей по синхронизации вкладок браузера с магазином NgRx: rel="nofollow noreferrer">blog.angularindepth.com/. Однако здесь есть некоторые сложные вопросы, например. что произойдет, если пользователь закроет вкладку браузера во время выполнения this.get(path).   -  person Will Taylor    schedule 21.06.2019


Ответы (1)


Если вам нужно установить связь между двумя отдельными браузерами (двумя разными людьми), вам, вероятно, потребуется изучить использование какого-либо типа связи Socket. Для Node это будет что-то вроде SocketIO.. Если ваш бэкэнд написан на C#, возможно, SignalR.

person caden311    schedule 20.06.2019