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

Комментарии 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 более правильным.
По мне так наоборот, лишняя сущность, лишний оператор, применение его не по назначению.

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

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