Как стать автором
Обновить

Комментарии 8

Async pipe - отличная вещь, но только в простых компонентах (с простым шаблоном и без бизнес-логики).

Когда появляется много структурных детектив - использовать пайп становится весьма затруднительно. Особенно учитывая то, что забаиндить значение стрима в шаблонную переменную возможно только через использование структурной детективы ngIf или ngFor.

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

А именно заведение одной переменной типа Subject и использование возможностей RxJS - takeUntil.

private unsubscrib$e: Subject<void> = new Subject<void>();

ngOnDedtroy() { this.unsubscribe$.next(); this.unsubscribe.complete();}

sub.pipe(takeUntil(this.unsubscribe$)).subscribe()!

Вот, собственно и все. Остаётся только добавить takeUntil на все подписки.

Вы правы насчет ngIf и ngFor. У нас используется tuiLet, когда в этих структурных директивах нет необходимости.

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

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

Но в большинстве случаев у нас используется AsyncPipe и проблем не наблюдаем.

Плюсую. Даже не знаю, как я раньше жил без tuiLet, вещь :)

Можно обходиться и без tuiLet, а просто прописать:
<ng-container *ngIf="{time: time$ | async} as data">
    <div>{{data.time}}</div>
</ng-container>

Но это не отменяет удобство taiga-ui.

Это правда, но в таком случае создается дополнительный объект в памяти. Рома Седов вот тут ответил подробнее.

Интересно, по каким причинам вы считаете способ с takeUntil более правильным.
По мне так наоборот, лишняя сущность, лишний оператор, применение его не по назначению.

Один из правильных способов отписки уже был рассмотрен здесь, исходники тут.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий