Заставить BehaviorSubject сохраняться на вкладках браузера?(@HostListener?) - PullRequest
0 голосов
/ 20 июня 2019

У нас есть приложение 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, я все равно не смогу определить, выполняется ли функция, если она была инициирована кем-то еще надругой компьютер, но для каждого пользователя локального хранилища может быть достаточно.

1 Ответ

2 голосов
/ 20 июня 2019

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

...