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$' ;
4
4
5
+ export interface UseFromEventConfig {
6
+ zoneless ?: boolean ;
7
+ }
5
8
6
9
/**
7
10
*
@@ -19,26 +22,37 @@ import {useOnDestroy} from "./use-host-listener$";
19
22
*
20
23
* @param eventName
21
24
*/
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 > {
25
42
const ngZone = inject ( NgZone ) ;
26
43
const events$ = new ReplaySubject < T > ( 1 ) ;
44
+ const cdr = cfg ?. zoneless ? undefined : inject ( ChangeDetectorRef ) ;
27
45
28
46
const el = elementOrRef instanceof ElementRef ? elementOrRef ?. nativeElement : elementOrRef ;
29
47
30
48
ngZone . runOutsideAngular ( ( ) => {
31
49
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
+ } ) ;
39
56
40
- return events$ . asObservable ( ) . pipe (
41
- distinctUntilChanged ( )
42
- ) ;
57
+ return events$ . asObservable ( ) . pipe ( distinctUntilChanged ( ) ) ;
43
58
}
44
-
0 commit comments