Ir al contenido

injectIsIntersecting

Created by Enea Jahollari

injectIsIntersecting es una función auxiliar que devuelve un observable que emite cuando el componente/directiva o un elemento dado está siendo intersecado.

Para manejar esto, se utiliza IntersectionObserver por debajo. La lógica de intersección se ejecuta fuera de Zone para mejor rendimiento.

import { injectIsIntersecting } from 'ngxtension/inject-is-intersecting';

Podemos usarlo para escuchar el componente mismo siendo intersecado.

@Component({})
export class MyComponent {
private destroyRef = inject(DestroyRef);
isIntersecting$ = injectIsIntersecting();
isInViewport$ = this.isIntersecting$.pipe(
filter((x) => x.intersectionRatio > 0),
take(1),
);
ngOnInit() {
this.getData().subscribe();
}
getData() {
// Solo obtiene datos cuando el elemento está en el viewport
return this.isInViewport$.pipe(
switchMap(() => this.service.getData()),
takeUntil(this.destroy$),
);
}
}

O podemos usarlo para escuchar un elemento dado siendo intersecado.

@Component({
template: `
<div #myDivRef></div>
`,
})
export class MyComponent implements OnInit {
@ViewChild('myDivRef', { static: true }) myDivEl!: HTMLDivElement;
private injector = inject(Injector);
ngOnInit() {
const divInViewport$ = injectIsIntersecting({
element: this.myDivEl,
injector: this.injector,
}).pipe(filter((x) => x.intersectionRatio > 0));
// Solo obtiene datos cuando el elemento está en el viewport
divInViewport$
.pipe(
switchMap(() => this.service.getData()),
take(1),
)
.subscribe();
}
}