8
8
import { inject , Injectable , NgZone , OnDestroy } from '@angular/core' ;
9
9
import { Observable , Subject } from 'rxjs' ;
10
10
import { filter , shareReplay , takeUntil } from 'rxjs/operators' ;
11
+ import { Platform } from '@angular/cdk/platform' ;
11
12
12
13
/**
13
14
* Handler that logs "ResizeObserver loop limit exceeded" errors.
@@ -32,14 +33,20 @@ class SingleBoxSharedResizeObserver {
32
33
/** Stream of all events from the ResizeObserver. */
33
34
private _resizeSubject = new Subject < ResizeObserverEntry [ ] > ( ) ;
34
35
/** ResizeObserver used to observe element resize events. */
35
- private _resizeObserver = new ResizeObserver ( entries => this . _resizeSubject . next ( entries ) ) ;
36
+ private _resizeObserver ?: ResizeObserver ;
36
37
/** A map of elements to streams of their resize events. */
37
38
private _elementObservables = new Map < Element , Observable < ResizeObserverEntry [ ] > > ( ) ;
38
39
39
40
constructor (
40
41
/** The box type to observe for resizes. */
41
42
private _box : ResizeObserverBoxOptions ,
42
- ) { }
43
+ /** The platform. */
44
+ platform : Platform ,
45
+ ) {
46
+ if ( platform . isBrowser ) {
47
+ this . _resizeObserver = new ResizeObserver ( entries => this . _resizeSubject . next ( entries ) ) ;
48
+ }
49
+ }
43
50
44
51
/**
45
52
* Gets a stream of resize events for the given element.
@@ -54,9 +61,9 @@ class SingleBoxSharedResizeObserver {
54
61
const subscription = this . _resizeSubject
55
62
. pipe ( filter ( entries => entries . some ( entry => entry . target === target ) ) )
56
63
. subscribe ( observer ) ;
57
- this . _resizeObserver . observe ( target , { box : this . _box } ) ;
64
+ this . _resizeObserver ? .observe ( target , { box : this . _box } ) ;
58
65
return ( ) => {
59
- this . _resizeObserver . unobserve ( target ) ;
66
+ this . _resizeObserver ? .unobserve ( target ) ;
60
67
subscription . unsubscribe ( ) ;
61
68
this . _elementObservables . delete ( target ) ;
62
69
} ;
@@ -78,7 +85,6 @@ class SingleBoxSharedResizeObserver {
78
85
this . _destroyed . complete ( ) ;
79
86
this . _resizeSubject . complete ( ) ;
80
87
this . _elementObservables . clear ( ) ;
81
- this . _resizeObserver . disconnect ( ) ;
82
88
}
83
89
}
84
90
@@ -102,6 +108,9 @@ export class SharedResizeObserver implements OnDestroy {
102
108
/** The Angular zone. */
103
109
private _ngZone = inject ( NgZone ) ;
104
110
111
+ /** The platform. */
112
+ private _platform = inject ( Platform ) ;
113
+
105
114
constructor ( ) {
106
115
if ( typeof ngDevMode === 'undefined' || ngDevMode ) {
107
116
this . _ngZone . runOutsideAngular ( ( ) => {
@@ -129,7 +138,7 @@ export class SharedResizeObserver implements OnDestroy {
129
138
observe ( target : Element , options ?: ResizeObserverOptions ) : Observable < ResizeObserverEntry [ ] > {
130
139
const box = options ?. box || 'content-box' ;
131
140
if ( ! this . _observers . has ( box ) ) {
132
- this . _observers . set ( box , new SingleBoxSharedResizeObserver ( box ) ) ;
141
+ this . _observers . set ( box , new SingleBoxSharedResizeObserver ( box , this . _platform ) ) ;
133
142
}
134
143
return this . _observers . get ( box ) ! . observe ( target ) ;
135
144
}
0 commit comments