как отписать нескольких подписчиков в англ 2

У меня есть shareService и подписка, которая есть в других компонентах:

import { Component, Input, OnDestroy } from '@angular/core';
import { MissionService } from './mission.service';
import { Subscription }   from 'rxjs/Subscription';
@Component({
  selector: 'my-astronaut',
  template: `
    <p>
      {{astronaut}}: <strong>{{mission}}</strong>
      <button
        (click)="confirm()"
        [disabled]="!announced || confirmed">
        Confirm
      </button>
    </p>
  `
})
export class AstronautComponent implements OnDestroy{
  @Input() astronaut: string;
  mission = "<no mission announced>";
  confirmed = false;
  announced = false;
  subscription:Subscription;

  constructor(private missionService: MissionService) {
    this.subscription = missionService.missionAnnounced$.subscribe(
      mission => {
        this.mission = mission;
        this.announced = true;
        this.confirmed = false;
    })




  }
  confirm() {
    this.confirmed = true;
    this.missionService.confirmMission(this.astronaut);
  }
  ngOnDestroy(){
    // prevent memory leak when component destroyed
    this.subscription.unsubscribe();

  }
}

Я хочу знать, есть ли у меня 2 подписчика в моемconstructorкак дважды отписаться подписчикам в нгДестрой? Я должен использоватьsubscription2:Subscription;а в нгдестройthis.subscription2.unsubscribe();? это правда?

 Alireza Valizade08 июн. 2016 г., 09:23
тнк мой друг;)
 Alireza Valizade08 июн. 2016 г., 10:08
this.subscriptions.push(myService.subscribe(...)) не работает ... не могу нажать!
 Günter Zöchbauer08 июн. 2016 г., 09:13
Да тебе нужен другойsubscriptionX переменная, где вы назначаете 2-ую подписку. А потом позвони.unsubscribe() на каждой.
 Günter Zöchbauer08 июн. 2016 г., 10:10
Это нужно инициализировать `подписка: подписка [] = [];
 Günter Zöchbauer08 июн. 2016 г., 09:24
Вы также можете использовать массив подписок и использоватьthis.subscriptions.push(myService.subscribe(...)) а затем сделатьthis.subscriptions.forEach((s) => s.unsubscribe())
 Alireza Valizade08 июн. 2016 г., 10:38
TNX это работает ... :) это лучше, чем у вас есть несколько подпискиX

Ответы на вопрос(2)

A Subscription можете хранить дочерние подписки и смело отписываться от них всех. Этот метод обрабатывает возможные ошибки (например, если какие-либо дочерние подписки равны нулю). Кроме того, если какие-либо подписки добавляются послеngOnDestroy называется, они будут сразу отписаться.

Следует отметить, чтоSubscription.add() возвращаетдобавленной подписка. Так цепочкиadd() лайкsubManager.add(sub1).add(sub2) добавлюsub2 вsub1, Это будет проблемой, еслиsub1 отписался ранее, так как он также отписывается отsub2.

import { OnDestroy } from "@angular/core";
import { Observable } from "rxjs/Observable";
import { Subscription } from "rxjs/Subscription";

export class MyComponent implements OnDestroy {
    ob1: Observable<number>;
    ob2: Observable<number>;
    subManager = new Subscription();

    constructor() {
        this.ob1 = Observable.interval(1000);
        this.ob2 = Observable.interval(2000);

        let sub1 = this.ob1.subscribe(val => console.log(val));
        let sub2 = this.ob2.subscribe(val => console.log(val));

        // DO NOT CHAIN add() - SEE ABOVE
        this.subManager.add(sub1);
        this.subManager.add(sub2);
    }

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

Отдокументация:

Кроме того, подписки могут быть сгруппированы с помощью метода add (), который присоединяет дочернюю подписку к текущей подписке. Когда подписка отменяется, все ее дочерние элементы (и ее внуки) также отписываются.

...

Если эта подписка уже находится в закрытом состоянии, переданная логика разрыва будет выполнена немедленно.

 Alireza Valizade24 авг. 2017 г., 16:08
Да, мой вопрос был для угловой бета
 makman9922 февр. 2019 г., 15:15
Да, я перечислил преимущества, которые мог придумать - см. Верхний абзац. Те же проверки нулевого и закрытого состояния могут быть выполнены с массивом подписок, но это именно то, что подписка. Нет смысла переделывать все это в вашем компоненте.
 Mathachew21 февр. 2019 г., 23:54
Есть ли такое преимущество перед массивом подписок, как в принятом ответе?
Решение Вопроса

Вы можете собирать подписки, которые вы хотите отписаться сразу вngOnDestroy() в массиве

export class AstronautComponent implements OnDestroy{
  @Input() astronaut: string;
  mission = "<no mission announced>";
  confirmed = false;
  announced = false;
  subscriptions:Subscription[] = [];

  constructor(private missionService: MissionService) {
    this.subscriptions.push(missionService.missionAnnounced$.subscribe(
      mission => {
        this.mission = mission;
        this.announced = true;
        this.confirmed = false;
    }));

    this.subscriptions.push(fooService.fooObservable$.subscribe(
      ...
    }));
  }

  confirm() {
    this.confirmed = true;
    this.missionService.confirmMission(this.astronaut);
  }

  ngOnDestroy(){
    // prevent memory leak when component destroyed
    this.subscriptions.forEach(s => s.unsubscribe());
  }
}
 Günter Zöchbauer04 нояб. 2016 г., 06:42
Благодарю. Смешал в некоторых дротиках случайно: - /
 Rajshri Mohan K S03 нояб. 2016 г., 21:58
Не должно ли это бытьthis.subscriptions.push() ?

Ваш ответ на вопрос