@@ -15,8 +15,8 @@ interface ActiveObserver {
15
15
}
16
16
17
17
const SYNC_DEFAULT = ! ENV . _DEFAULT_ASYNC_OBSERVERS ;
18
- const SYNC_OBSERVERS : Map < object , Map < string , ActiveObserver > > = new Map ( ) ;
19
- const ASYNC_OBSERVERS : Map < object , Map < string , ActiveObserver > > = new Map ( ) ;
18
+ export const SYNC_OBSERVERS : Map < object , Map < string , ActiveObserver > > = new Map ( ) ;
19
+ export const ASYNC_OBSERVERS : Map < object , Map < string , ActiveObserver > > = new Map ( ) ;
20
20
21
21
/**
22
22
@module @ember /object
@@ -153,15 +153,16 @@ export function revalidateObservers(target: object) {
153
153
let lastKnownRevision = 0 ;
154
154
155
155
export function flushAsyncObservers ( shouldSchedule = true ) {
156
- if ( lastKnownRevision === value ( CURRENT_TAG ) ) {
156
+ let currentRevision = value ( CURRENT_TAG ) ;
157
+ if ( lastKnownRevision === currentRevision ) {
157
158
return ;
158
159
}
159
-
160
- lastKnownRevision = value ( CURRENT_TAG ) ;
160
+ lastKnownRevision = currentRevision ;
161
161
162
162
ASYNC_OBSERVERS . forEach ( ( activeObservers , target ) => {
163
163
let meta = peekMeta ( target ) ;
164
164
165
+ // if observer target is destroyed remove observers
165
166
if ( meta && ( meta . isSourceDestroying ( ) || meta . isMetaDestroyed ( ) ) ) {
166
167
ASYNC_OBSERVERS . delete ( target ) ;
167
168
return ;
@@ -171,7 +172,7 @@ export function flushAsyncObservers(shouldSchedule = true) {
171
172
if ( ! validate ( observer . tag , observer . lastRevision ) ) {
172
173
let sendObserver = ( ) => {
173
174
try {
174
- sendEvent ( target , eventName , [ target , observer . path ] ) ;
175
+ sendEvent ( target , eventName , [ target , observer . path ] , undefined , meta ) ;
175
176
} finally {
176
177
observer . tag = combine ( getChainTagsForKey ( target , observer . path ) ) ;
177
178
observer . lastRevision = value ( observer . tag ) ;
@@ -205,7 +206,7 @@ export function flushSyncObservers() {
205
206
if ( ! observer . suspended && ! validate ( observer . tag , observer . lastRevision ) ) {
206
207
try {
207
208
observer . suspended = true ;
208
- sendEvent ( target , eventName , [ target , observer . path ] ) ;
209
+ sendEvent ( target , eventName , [ target , observer . path ] , undefined , meta ) ;
209
210
} finally {
210
211
observer . tag = combine ( getChainTagsForKey ( target , observer . path ) ) ;
211
212
observer . lastRevision = value ( observer . tag ) ;
@@ -229,3 +230,8 @@ export function setObserverSuspended(target: object, property: string, suspended
229
230
observer . suspended = suspended ;
230
231
}
231
232
}
233
+
234
+ export function destroyObservers ( target : object ) {
235
+ if ( SYNC_OBSERVERS . size > 0 ) SYNC_OBSERVERS . delete ( target ) ;
236
+ if ( ASYNC_OBSERVERS . size > 0 ) ASYNC_OBSERVERS . delete ( target ) ;
237
+ }
0 commit comments