У меня есть приложение со специальной библиотекой (tools
), содержащей ряд компонентов, которые будут использоваться другими проектами в приложении (назовем один из них data-portal
).
Для некоторого контекста в data-portal
app.component. html У меня есть:
<div>
...
<lib-primeng-menu-nav></lib-primeng-menu-nav>
<router-outlet></router-outlet>
...
</div>
, где lib-primeng-menu-nav
из библиотеки tools
содержит навигацию для проекта и router-outlet
может отображать несколько разных представлений, одно из которых показывает несколько диаграмм с данными временных рядов (также из библиотеки tools
):
Когда Если пользователь щелкает значок звездочки в левом нижнем углу диаграмм, он должен переключить эту серию из режима просмотра «Анализатор», где несколько серий можно нарисовать на одной диаграмме для сравнения. У меня есть служба анализатора в tools
, предназначенная для отслеживания того, какие серии должны отображаться в анализаторе.
Вернувшись к панели навигации, ссылка на анализатор также должна отображать счетчик количества серий. было выбрано:
<nav id="sidebar-nav" class="navbar navbar-fixed-top navbar-light">
...
<a routerLink="/analyzer"> Analyzer ({{analyzerSeries}})</a>
...
</nav>
И вот моя проблема: Я не могу изменить счетчик. При начальной загрузке ссылка отображается как Analyzer (0)
, как и должно быть, но всякий раз, когда я нажимаю на одну из добавляемых серий, счетчик остается на 0. Если я перейду в представление Анализатора, на дисплее правильно отобразится нужная серия в график, но на панели навигации по-прежнему отображается (0)
на счетчике. Все остальное поведение, связанное с просмотром и сервисом анализатора, похоже, работает нормально.
Вот то, что я пробовал до сих пор:
Метод 1
analyzer.service.ts :
@Injectable({
providedIn: 'root'
})
export class AnalyzerService {
// Keep track of series in the analyzer
public analyzerSeries = [];
public analyzerData = {
analyzerTableDates: [],
analyzerSeries: [],
};
primeng-menu-nav.component.ts
constructor(
private _analyzerService: AnalyzerService,
private route: ActivatedRoute,
private _router: Router
) { }
ngOnInit() {
...
this.analyzerSeries = this._analyzerService.analyzerSeries.length;
...
}
primeng- menu-nav.component. html
<nav id="sidebar-nav" class="navbar navbar-fixed-top navbar-light">
...
<a routerLink="/analyzer"> Analyzer ({{analyzerSeries}})</a>
...
</nav>
Метод 2
analyzer.service.ts
public analyzerSeries = [];
private analyzerSeriesTest = new BehaviorSubject(null);
analyzerSeries$ = this.analyzerSeriesTest.asObservable();
...
updateAnalyzer(seriesId) {
...
this.analyzerSeriesTest.next(this.analyzerSeries.length);
...
}
primeng-menu-nav.component.ts
constructor(
public _analyzerService: AnalyzerService,
private route: ActivatedRoute,
private _router: Router
) {
this.analyzerSeriesCount = this._analyzerService.analyzerSeries$.subscribe((data: any) => {
this.analyzerSeries = data;
});
}
Ни один из них не работал. Я также пробовал использовать EventEmitter вместо Behavior Subject в службе для компонента, на который нужно подписаться, и я наткнулся на стену. Я подозреваю, что услуга предоставляется неправильно, но я не совсем уверен. Насколько я понимаю,
@Injectable({
providedIn: 'root'
})
предоставляет услугу как одноэлементную, которая будет доступна во всем приложении. У меня нет услуги, указанной в качестве поставщика ни в одном из моих модулей.