@@ -17,6 +17,8 @@ import { NavigationData } from '.';
17
17
export { NavigationType } from './frame-interfaces' ;
18
18
export type { AndroidActivityCallbacks , AndroidFragmentCallbacks , AndroidFrame , BackstackEntry , NavigationContext , NavigationEntry , NavigationTransition , TransitionState , ViewEntry , iOSFrame } from './frame-interfaces' ;
19
19
20
+ const FRAME_ENTRY_LOADED_EVENT = '_frameEntryLoaded' ;
21
+
20
22
function buildEntryFromArgs ( arg : any ) : NavigationEntry {
21
23
let entry : NavigationEntry ;
22
24
if ( typeof arg === 'string' ) {
@@ -76,13 +78,13 @@ export class FrameBase extends CustomLayoutView {
76
78
return true ;
77
79
} else if ( top ) {
78
80
let parentFrameCanGoBack = false ;
79
- let parentFrame = < FrameBase > getAncestor ( top , 'Frame' ) ;
81
+ let parentFrame = getAncestor ( top , 'Frame' ) ;
80
82
81
83
while ( parentFrame && ! parentFrameCanGoBack ) {
82
84
if ( parentFrame && parentFrame . canGoBack ( ) ) {
83
85
parentFrameCanGoBack = true ;
84
86
} else {
85
- parentFrame = < FrameBase > getAncestor ( parentFrame , 'Frame' ) ;
87
+ parentFrame = getAncestor ( parentFrame , 'Frame' ) ;
86
88
}
87
89
}
88
90
@@ -127,14 +129,29 @@ export class FrameBase extends CustomLayoutView {
127
129
super . onLoaded ( ) ;
128
130
129
131
if ( parentFrame ?. isLoadingSubviews ) {
130
- parentFrame . once ( 'frameEntryLoaded' , ( ) => {
131
- this . onFrameLoaded ( ) ;
132
+ const frameRef = new WeakRef ( this ) ;
133
+
134
+ parentFrame . once ( FRAME_ENTRY_LOADED_EVENT , ( ) => {
135
+ const frame = frameRef . deref ( ) ;
136
+ if ( frame ) {
137
+ frame . onFrameLoaded ( ) ;
138
+ }
132
139
} ) ;
133
140
} else {
134
141
this . onFrameLoaded ( ) ;
135
142
}
136
143
}
137
144
145
+ @profile
146
+ public onUnloaded ( ) {
147
+ super . onUnloaded ( ) ;
148
+
149
+ // This is a precaution in case the method is called asynchronously during the loading procedure
150
+ if ( this . hasListeners ( FRAME_ENTRY_LOADED_EVENT ) ) {
151
+ this . off ( FRAME_ENTRY_LOADED_EVENT ) ;
152
+ }
153
+ }
154
+
138
155
public onFrameLoaded ( ) : void {
139
156
this . _processNextNavigationEntry ( ) ;
140
157
this . _notifyFrameEntryLoaded ( ) ;
@@ -338,15 +355,16 @@ export class FrameBase extends CustomLayoutView {
338
355
339
356
protected _notifyFrameEntryLoaded ( ) : void {
340
357
this . notify ( {
341
- eventName : 'frameEntryLoaded' ,
358
+ eventName : FRAME_ENTRY_LOADED_EVENT ,
342
359
object : this ,
343
360
} ) ;
344
361
}
345
362
346
363
private isNestedWithin ( parentFrameCandidate : FrameBase ) : boolean {
347
- let frameAncestor : FrameBase = this ;
364
+ let frameAncestor = this as FrameBase ;
365
+
348
366
while ( frameAncestor ) {
349
- frameAncestor = < FrameBase > getAncestor ( frameAncestor , FrameBase ) ;
367
+ frameAncestor = getAncestor ( frameAncestor , FrameBase ) ;
350
368
if ( frameAncestor === parentFrameCandidate ) {
351
369
return true ;
352
370
}
0 commit comments