Поведение Тема отписаться рефакторинг - PullRequest
0 голосов
/ 06 июля 2018

Это не может быть единственным способом отменить субъекты поведения:

  maxSub;
  fromSub;
  toSub;
  pageNumberSub;
  originalMaxSub;
  selectionSub;
  selectionOfInterestSub;

  constructor(private store: StoreService) {}

  ngAfterContentChecked(){
    this.maxSub = this.store.max$.subscribe((max) => {
      if(max !== null && max !== undefined){
        this.max = max;
        this.maxPages = Math.floor(this.max / Variables.to);
        this.pages = Array.from(Array(this.maxPages), (x, i) => i + 1);
      }
    }, (error) => console.log(error), () => {});

    this.fromSub = this.store.from$.subscribe((from) => {
      if(from !== null && from !== undefined) {this.from = from; this.split = this.to - (this.from - 1)}
    }, (error) => console.log(error), () => {});

    this.toSub = this.store.to$.subscribe((to) => {
      if(to !== null && to !== undefined) {this.to = to; this.split = this.to - (this.from - 1)}
    }, (error) => console.log(error), () => {});

    this.pageNumberSub = this.store.pageNumber$.subscribe((pageNumber) => {
      if(pageNumber !== null && pageNumber !== undefined) {this.page = pageNumber;}
    }, (error) => console.log(error), () => {});

    this.originalMaxSub = this.store.originalMax$.subscribe((originalMax) => {
      if(originalMax !== null && originalMax !== undefined) {this.originalMax = originalMax;}
    }, (error) => console.log(error), () => {});

    this.selectionSub = this.store.selection$.subscribe((selection) => {
      if(selection !== null && selection !== undefined) this.selectedAmount = selection.length;
    }, (error) => console.log(error), () => {});

    this.selectionOfInterestSub = this.store.selectionOfInterest$.subscribe((selectionOfInterest) => {
      if(selectionOfInterest !== null && selectionOfInterest !== undefined) this.selectionOfInterest = selectionOfInterest;
    }, (error) => console.log(error), () => {});
  }

  ngOnDestroy(){
    this.maxSub.unsubscribe();
    this.fromSub.unsubscribe();
    this.toSub.unsubscribe();
    this.pageNumberSub.unsubscribe();
    this.originalMaxSub.unsubscribe();
    this.selectionSub.unsubscribe();
    this.selectionOfInterestSub.unsubscribe();
  }

в обычных старых Observables вы можете просто:

alive = true;

constructor(private store: StoreService) {}

  ngAfterContentChecked(){
     this.store.thing.subscribe().takeWhile(this.alive)...
  }

  ngOnDestroy(){
    this.alive = false;
  }

что намного проще.

Разве нет способа сделать то же самое с субъектами поведения?

Еще одна вещь: я упускаю фундаментальное свойство субъектов поведения, которое они подписывают только один раз в классе, независимо от того, сколько раз вызывается подписка, и поэтому не существует такого понятия, как takeWhile() в субъектах поведения?

1 Ответ

0 голосов
/ 11 июля 2018

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

2 - Так как вы одновременно отказываетесь от подписки и вы явно не используете Subject для чего-либо еще, тогда можно использовать одну и ту же переменную Subject для всех ваших подпрограмм, а затем вы можете отписаться с помощью oneline кода, и вы не нужно инициализировать все эти экземпляры Subject.

...