Как отписаться от ngrx/store?

у меня есть компонент, который получает данные от подписки на магазина.

this.store.select('somedata').subscribe((state: any) => {
  this.somedata = state.data;
});

Я хочу отказаться от этой подписки, когда компонента больше нет, в других местах, где я подписываюсь на некоторые наблюдаемые, что-то вроде этого:

this.service.data.subscribe(
   (result: any) => {//data}
);

я отписался на ngOnOnDestroy, вот так:

ngOnDestroy(){
   this.service.data.unsubscribe();
}

но в случае магазина я не могу, это дает мне ошибку:

Property 'unsubscribe' does not exist on type 'Store<State>'

3 ответов


при подписке вы получите объект подписки на нем вы можете вызвать unsubscribe ()

const subscription = this.store.select('somedata').subscribe((state: any) => {
  this.somedata = state.data;
});
// later
subscription.unsubscribe();

или

ngOnInit(){
 this.someDataSubscription = this.store.select('somedata').subscribe((state: any) => {
  this.somedata = state.data;
 });
}

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

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

@Component({
    template: `
        <div>Current Count: {{ counter | async }}</div>
    `
})
class MyAppComponent {
    counter: Observable<number>;

    constructor(private store: Store<AppState>){
        this.counter = store.select('counter');
    }
}

здесь мы используем асинхронный канал для получения значения. Асинхронный канал подписывается на наблюдаемое или обещание и возвращает последнее значение, которое он испустил. Когда выдается новое значение, асинхронный канал помечает компонент, который необходимо проверить на наличие изменений. Когда компонент уничтожается, асинхронный канал автоматически отменяет подписку, чтобы избежать потенциальных утечек памяти.


вам не нужно подписываться в первую очередь использовать | async в шаблоне. Все, что вы получаете от магазина, можно наблюдать, пусть angular обрабатывает вашу подписку. Вот api