Комментарии 8
Да, там 4 разных байндинга, соответственно, 4 разные подписки. Можно порулить через share
, но вообще это довольно экстремальный кейс, когда тебе надо на несколько сущностей забайндить один и тот же стрим :)
И тогда получается что создается не 4 пописки, а 8: по подписке на каждый HostBinding в каждом атрибуте.
Увеличивая количество атрибутов с подобным подходом, не получим ли проблем?
console.log
прописан в стриме test
. Он дёргается 2 раза, потому что мы байндим его на data-test
и style.height.px
. Так же мы от него создаём стрим active
, ведь мы его пайпим. Там ещё 2 подписки — на class._active
и disabled
. Если test
записать вот так, то console.log
будет один:
readonly test = interval(1000).pipe(
tap(console.log),
startWith(0),
share(), // <--- Добавим
);
Проблем тут будет не больше, чем при любом другом использовании RxJS :)
Так:
constructor(
@Inject(TuiDestroyService) destroy$: Observable<void>,
@Inject(ChangeDetectorRef) changeDetectorRef: ChangeDetectorRef,
) { }
Вместо:
constructor(
destroy$: TuiDestroyService,
changeDetectorRef: ChangeDetectorRef,
) { }
1) Так можно указывать более общий тип, чтобы, если что, подменять реализацию — в первой строчке Observable<void>
а не TuiDestroyService
. Даже надо бы <unknown>
написать :)
2) Раньше без этого нельзя было собирать проект без метаданных, что усложняло работу с Universal
3) Токены без этого не подрубишь, а мне нравится единообразие — поэтому пишу всегда одинаково, не думая, токен там или сервис
Учим HostBinding работать с Observable