Я застрял при разработке приложения Angular 8 из-за проблемы. На интерфейсе есть две кнопки. Когда я нажимаю кнопку, запускается событие, которое предоставляет мне свою позицию индекса в массиве packageHeaders.
<p-tabView (onChange)="tabChange($event)">
<p-tabPanel *ngFor="let tabHeader of packageHeaders" [header]=tabHeader>
//few html lines
</p-tabPanel>
</p-tabView>
На основе индекса я отображаю данные пакета в 3-4 различных компонентах и выполняю вычисления в соответствии с бизнес-правилами / требованиями.
Чтобы сделать выбранный индекс доступным во всех компонентах, я объявил BehaviourSubject в классе обслуживания и передал ему индекс. Затем, после этого, я выпускаю его как видимый, чтобы мои компоненты могли подписаться на него. Ниже приведен фрагмент кода класса обслуживания:
public tabIndex = new BehaviorSubject<number>(0);
findTabClicked(changeInTabSelection: number) {
this.tabIndex.next(changeInTabSelection);
}
getSelectedTab(): Observable<number> {
return this.tabIndex.asObservable();
}
В моих компонентах я подписываюсь на него, чтобы получить последнее выбранное значение. Например:
this.service.getSelectedTab().subscribe((selectedTabIndex) => {
this.packageTypeInUse(selectedTabIndex);
this.calculateTotalOnQuantityChange(this.regularIndex[selectedTabIndex]);
});
Я также отписался об этом в хуке жизненного цикла ngOnDestroy (). В шаблоне я использую для l oop, чтобы показать строку Items *ngFor="let item of packageLineItems[tabIndex]
Итак, основываясь на этом индексе, я отображаю список позиций в пользовательском интерфейсе. Я могу изменить значения элемента. Я также могу перейти к другому tabHeader, нажав кнопку.
Есть две проблемы:
- Приведенный выше метод подписки вызывается дважды во всех компонентах.
- При отладке кода я узнал, что в первой подписке мой массив packageLineItems [tabIndex] имел измененные значения, но он переопределяется начальными значениями массива во второй подписке.
Я инициализировал массив в ngOnInit (). Просто чтобы быть уверенным, я также убедился, что при изменении заголовков вкладок ngOnInit () не вызывается. Не уверен, как массив возвращается к исходным значениям автоматически при втором нежелательном вызове подписки.