Наблюдаемый, отписаться в нгОнДестрой не работает - PullRequest
0 голосов
/ 13 июня 2018

У меня есть диалоговое окно, которое открывается и содержит компонент ... в компоненте я делаю подписку.При закрытии я хочу отписаться ..

private deviceObserver: Observable<BreakpointState> = this.breakpointObserver.observe([Breakpoints.XSmall]);

this.deviceObserver.subscribe(result => {
  if (result.matches) {
    this.deviceType = 'mobile';
  } else {
    this.deviceType = 'desktop';
  }
});

ngOnDestroy() {
 this.deviceObserver.unsubscribe();
}

Это дает мне такую ​​ошибку:

Свойство «отписаться» не существует для типа «Наблюдаемый».Вы имели в виду «подписаться»?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

По какой-то причине отписка в ngOnDestroy сломала приложение ... Вот как я решил:

private deviceObserver: Observable<BreakpointState> = this.breakpointObserver.observe([Breakpoints.XSmall]);
private breakpointObserverSubscription: Subscription;


// in ngOnInit()
this.breakpointObserverSubscription = this.deviceObserver.subscribe(result => {
  if (result.matches) {
    this.deviceType = 'mobile';
  } else {
    this.deviceType = 'desktop';
  }
});

public closeSearch() {
 this.onClose.apply();
 this.breakpointObserverSubscription.unsubscribe();
}
0 голосов
/ 13 июня 2018

Вы можете использовать unsubscribe только на Subscription.Вы пытаетесь использовать его на Observable.

. Если вы используете наблюдаемое внутри вашего компонента, используя async канал, вам не нужно отписываться.Это автоматически выполняется фреймворком.

Если вы используете его внутри component.ts, то один из способов - сделать это следующим образом.Есть и другие варианты, например, takeUntil pipe:

private deviceObserver: Observable<BreakpointState> = 
                        this.breakpointObserver.observe([Breakpoints.XSmall]);

ngOnInit() {
  this.sub = this.deviceObserver.subscribe(result => {
    if (result.matches) {
      this.deviceType = 'mobile';
    } else {
      this.deviceType = 'desktop';
    }
  });
}

ngOnDestroy() {
 this.sub.unsubscribe();
}
...