У нас есть 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 может быть достаточно адекватным.
this.get(path)
. - person Will Taylor   schedule 21.06.2019