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