@@ -19,6 +19,7 @@ import {
19
19
OnDestroy ,
20
20
Output ,
21
21
booleanAttribute ,
22
+ inject ,
22
23
} from '@angular/core' ;
23
24
import { Observable , Observer , Subject , Subscription } from 'rxjs' ;
24
25
import { debounceTime , filter , map } from 'rxjs/operators' ;
@@ -74,6 +75,8 @@ export class ContentObserver implements OnDestroy {
74
75
}
75
76
> ( ) ;
76
77
78
+ private _ngZone = inject ( NgZone ) ;
79
+
77
80
constructor ( private _mutationObserverFactory : MutationObserverFactory ) { }
78
81
79
82
ngOnDestroy ( ) {
@@ -102,7 +105,11 @@ export class ContentObserver implements OnDestroy {
102
105
map ( records => records . filter ( record => ! shouldIgnoreRecord ( record ) ) ) ,
103
106
filter ( records => ! ! records . length ) ,
104
107
)
105
- . subscribe ( observer ) ;
108
+ . subscribe ( records => {
109
+ this . _ngZone . run ( ( ) => {
110
+ observer . next ( records ) ;
111
+ } ) ;
112
+ } ) ;
106
113
107
114
return ( ) => {
108
115
subscription . unsubscribe ( ) ;
@@ -116,21 +123,23 @@ export class ContentObserver implements OnDestroy {
116
123
* new one if not.
117
124
*/
118
125
private _observeElement ( element : Element ) : Subject < MutationRecord [ ] > {
119
- if ( ! this . _observedElements . has ( element ) ) {
120
- const stream = new Subject < MutationRecord [ ] > ( ) ;
121
- const observer = this . _mutationObserverFactory . create ( mutations => stream . next ( mutations ) ) ;
122
- if ( observer ) {
123
- observer . observe ( element , {
124
- characterData : true ,
125
- childList : true ,
126
- subtree : true ,
127
- } ) ;
126
+ return this . _ngZone . runOutsideAngular ( ( ) => {
127
+ if ( ! this . _observedElements . has ( element ) ) {
128
+ const stream = new Subject < MutationRecord [ ] > ( ) ;
129
+ const observer = this . _mutationObserverFactory . create ( mutations => stream . next ( mutations ) ) ;
130
+ if ( observer ) {
131
+ observer . observe ( element , {
132
+ characterData : true ,
133
+ childList : true ,
134
+ subtree : true ,
135
+ } ) ;
136
+ }
137
+ this . _observedElements . set ( element , { observer, stream, count : 1 } ) ;
138
+ } else {
139
+ this . _observedElements . get ( element ) ! . count ++ ;
128
140
}
129
- this . _observedElements . set ( element , { observer, stream, count : 1 } ) ;
130
- } else {
131
- this . _observedElements . get ( element ) ! . count ++ ;
132
- }
133
- return this . _observedElements . get ( element ) ! . stream ;
141
+ return this . _observedElements . get ( element ) ! . stream ;
142
+ } ) ;
134
143
}
135
144
136
145
/**
@@ -202,7 +211,6 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy {
202
211
constructor (
203
212
private _contentObserver : ContentObserver ,
204
213
private _elementRef : ElementRef < HTMLElement > ,
205
- private _ngZone : NgZone ,
206
214
) { }
207
215
208
216
ngAfterContentInit ( ) {
@@ -219,15 +227,9 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy {
219
227
this . _unsubscribe ( ) ;
220
228
const stream = this . _contentObserver . observe ( this . _elementRef ) ;
221
229
222
- // TODO(mmalerba): We shouldn't be emitting on this @Output() outside the zone.
223
- // Consider brining it back inside the zone next time we're making breaking changes.
224
- // Bringing it back inside can cause things like infinite change detection loops and changed
225
- // after checked errors if people's code isn't handling it properly.
226
- this . _ngZone . runOutsideAngular ( ( ) => {
227
- this . _currentSubscription = (
228
- this . debounce ? stream . pipe ( debounceTime ( this . debounce ) ) : stream
229
- ) . subscribe ( this . event ) ;
230
- } ) ;
230
+ this . _currentSubscription = (
231
+ this . debounce ? stream . pipe ( debounceTime ( this . debounce ) ) : stream
232
+ ) . subscribe ( this . event ) ;
231
233
}
232
234
233
235
private _unsubscribe ( ) {
0 commit comments