Angular - DialogRef - Отказаться от подписки - Нужно ли отписываться от afterClosed? - PullRequest
1 голос
/ 02 октября 2019

Один из моих коллег спросил меня, нужно ли нам отписываться от Observable для afterClosed () диалога.

Мы используем шаблон takeUntil для отмены подписки на все Observables в ngOnDestroy ().

this.backEvent = fromEvent(window, 'popstate')
    .pipe(
        takeUntil(this.destroy$)
    )
    .subscribe(
        () => {
            this.navigationService.backClicked = true;
            this.navigationService.navigateBackToDirectoryCenter();
        }
    );

ngOnDestroy ()

ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
}

Так нужно ли отписываться от afterClosed () Observable?

dialogRef.afterClosed().subscribe(
    (data) => {
            console.log(data);
        }
    },
);

или?

dialogRef.afterClosed()
    .pipe(
        takeUntil(this.destroy$)
    )
    .subscribe(
        (data) => {
            console.log(data);
        },
    );

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Нет

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

import { finalize } from "rxjs/operators";
dialogRef
  .afterClosed()
  .pipe(finalize(() => console.log("completed")))
  .subscribe(data => {
    console.log(data);
  });

И когда вы закроете диалог, вы увидите completed в консоли, это показывает, что вам не нужно отписываться от наблюдаемого.

1 голос
/ 02 октября 2019

Хороший вопрос, только что посмотрел документы (https://material.angular.io/components/dialog/overview), кажется, ничто не намекает на необходимость вообще отказаться от подписки, того, что у вас уже есть, должно хватить.

...