Skip to content

Commit b098529

Browse files
committed
feat(cdk): make it configurable to run change detection of not in useFromEvent$
1 parent 8e6a119 commit b098529

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed

libs/cdk/rx-interop/src/lib/use-functions/use-from-event$.ts

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import {ElementRef, inject, NgZone} from "@angular/core";
2-
import {distinctUntilChanged, fromEvent, Observable, ReplaySubject, takeUntil} from "rxjs";
3-
import {useOnDestroy} from "./use-host-listener$";
1+
import {ChangeDetectorRef, ElementRef, inject, NgZone} from '@angular/core';
2+
import {distinctUntilChanged, fromEvent, Observable, ReplaySubject, takeUntil} from 'rxjs';
3+
import {useOnDestroy} from './use-host-listener$';
44

5+
export interface UseFromEventConfig {
6+
zoneless?: boolean;
7+
}
58

69
/**
710
*
@@ -19,26 +22,37 @@ import {useOnDestroy} from "./use-host-listener$";
1922
*
2023
* @param eventName
2124
*/
22-
export function useFromEvent$<T extends Event>(element: HTMLElement,eventName: string): Observable<T>
23-
export function useFromEvent$<T extends Event>(elementRef: ElementRef,eventName: string): Observable<T>
24-
export function useFromEvent$<T extends Event>(elementOrRef: HTMLElement | ElementRef,eventName: string): Observable<T>{
25+
export function useFromEvent$<T extends Event>(element: HTMLElement, eventName: string): Observable<T>;
26+
export function useFromEvent$<T extends Event>(elementRef: ElementRef, eventName: string): Observable<T>;
27+
export function useFromEvent$<T extends Event>(
28+
element: HTMLElement,
29+
eventName: string,
30+
cfg: UseFromEventConfig
31+
): Observable<T>;
32+
export function useFromEvent$<T extends Event>(
33+
elementRef: ElementRef,
34+
eventName: string,
35+
cfg: UseFromEventConfig
36+
): Observable<T>;
37+
export function useFromEvent$<T extends Event>(
38+
elementOrRef: HTMLElement | ElementRef,
39+
eventName: string,
40+
cfg?: UseFromEventConfig
41+
): Observable<T> {
2542
const ngZone = inject(NgZone);
2643
const events$ = new ReplaySubject<T>(1);
44+
const cdr = cfg?.zoneless ? undefined : inject(ChangeDetectorRef);
2745

2846
const el = elementOrRef instanceof ElementRef ? elementOrRef?.nativeElement : elementOrRef;
2947

3048
ngZone.runOutsideAngular(() => {
3149
fromEvent<T>(el, eventName)
32-
.pipe(
33-
takeUntil(useOnDestroy())
34-
)
35-
.subscribe(value =>
36-
events$.next(value)
37-
);
38-
})
50+
.pipe(takeUntil(useOnDestroy()))
51+
.subscribe((value) => {
52+
events$.next(value);
53+
cfg?.zoneless ? void 0 : cdr.detectChanges();
54+
});
55+
});
3956

40-
return events$.asObservable().pipe(
41-
distinctUntilChanged()
42-
);
57+
return events$.asObservable().pipe(distinctUntilChanged());
4358
}
44-

0 commit comments

Comments
 (0)