Проблема в том, как вы отписываетесь.
BasicService хорош, но давайте попробуем это:
export class BasicService {
private messageSource: Subject<any>;
public currentMessage: Observable<any>;
constructor() {
this.messageSource = new Subject();
this.currentMessage = this.messageSource.asObservable();
}
changeMessage(currentMessage) {
this.messageSource.next(currentMessage);
}
}
Кроме того, вы можете использовать BehaviorSubject, он работает так же, как Subject ивы всегда сохраняете последнее значение: https://medium.com/@luukgruijs/understanding-rxjs-behaviorsubject-replaysubject-and-asyncsubject-8cc061f1cfc0
export class BasicService {
private messageSource: BehaviorSubject<any>;
public currentMessage: Observable<any>;
constructor() {
this.messageSource = new BehaviorSubject();
this.currentMessage = this.messageSource.asObservable();
}
changeMessage(currentMessage) {
this.messageSource.next(currentMessage);
}
getLastValue(): any {
this.messageSource.value;
}
}
Затем в компоненте, который вы используете BasicService, вы должны отписаться следующим образом:
export class CustomComponent implements OnInit, OnDestroy {
let subscription: Subscription;
constructor(private basicService: BasicService) {}
public ngOnInit() {
this.subscription = this.basicService.currentMessage.subscribe(
// do something when a event is emitted
);
}
public ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Это основной способобрабатывать подписки.
Я рекомендую вам начать использовать RxJ для обработки подписок:
https://angular -guru.com / blog / angular-more-unknown-features (Раздел 8. Подписки RxJS)