Непонятно в вашем вопросе, где и как вызывается метод open()
.Это open()
, вызываемый дважды или subscribe()
, запускаемый дважды?
Но если вы хотите поделиться последним значением с подписчиками, вы можете использовать shareReplay()
в pipe()
следующим образом:
export class ModalService {
openModalSubject = new Subject();
openModal = this.openModalSubject.asObservable().pipe(shareReplay());
constructor() { }
open(cmp) {
this.openModalSubject.next(cmp);
}
}
ОБНОВЛЕНИЕ
И в вашем модальном компоненте вам необходимо unsubscribe
из наблюдаемого при навигации по нему.Вы можете сделать это двумя способами.
Первый путь:
modalSubscription: Subscription;
ngOnInit() {
this.modalSubscription = this.modalService.openModal.subscribe(cmp => {
// CALLD TWICE EVRY TIME THE SERVICE CALLS .next()
console.log(cmp);
});
}
ngOnDestroy(){
this.modalSubscription.unsubscribe();
}
Второй путь:
unsubscribeSignal: Subject<void> = new Subject();
ngOnInit() {
this.modalSubscription = this.modalService.openModal
.pipe(
takeUntil(this.unsubscribeSignal.asObservable()),
)
.subscribe(cmp => {
// CALLD TWICE EVRY TIME THE SERVICE CALLS .next()
console.log(cmp);
});
}
ngOnDestroy(){
this.unsubscribeSignal.next();
}
Я предпочитаю второй способ в основном.Таким образом, вы можете отписаться от нескольких наблюдаемых одновременно.