1- import { Attribute , ChangeDetectorRef , ComponentFactory , ComponentFactoryResolver , ComponentRef , Directive , Inject , InjectionToken , Injector , OnDestroy , EventEmitter , Output , Type , ViewContainerRef , ElementRef , InjectFlags , NgZone } from '@angular/core' ;
2- import { ActivatedRoute , ActivatedRouteSnapshot , ChildrenOutletContexts , PRIMARY_OUTLET } from '@angular/router' ;
1+ import { Attribute , ChangeDetectorRef , ComponentFactory , ComponentFactoryResolver , ComponentRef , Directive , Inject , InjectionToken , Injector , OnDestroy , EventEmitter , Output , Type , ViewContainerRef , ElementRef , InjectFlags , NgZone , EnvironmentInjector } from '@angular/core' ;
2+ import { ActivatedRoute , ActivatedRouteSnapshot , ChildrenOutletContexts , Data , PRIMARY_OUTLET , RouterOutletContract } from '@angular/router' ;
33
44import { Frame , Page , NavigatedData , profile , NavigationEntry } from '@nativescript/core' ;
55
@@ -54,7 +54,7 @@ registerElement('page-router-outlet', () => Frame);
5454// eslint-disable-next-line @angular-eslint/directive-selector
5555@Directive ( { selector : 'page-router-outlet' } ) // tslint:disable-line:directive-selector
5656// eslint-disable-next-line @angular-eslint/directive-class-suffix
57- export class PageRouterOutlet implements OnDestroy {
57+ export class PageRouterOutlet implements OnDestroy , RouterOutletContract {
5858 // tslint:disable-line:directive-class-suffix
5959 private activated : ComponentRef < any > | null = null ;
6060 private _activatedRoute : ActivatedRoute | null = null ;
@@ -66,6 +66,9 @@ export class PageRouterOutlet implements OnDestroy {
6666 private viewUtil : ViewUtil ;
6767 private frame : Frame ;
6868
69+ attachEvents : EventEmitter < unknown > = new EventEmitter ( ) ;
70+ detachEvents : EventEmitter < unknown > = new EventEmitter ( ) ;
71+
6972 // eslint-disable-next-line @angular-eslint/no-output-rename
7073 @Output ( 'activate' ) activateEvents = new EventEmitter < any > ( ) ; // tslint:disable-line:no-output-rename
7174 // eslint-disable-next-line @angular-eslint/no-output-rename
@@ -105,6 +108,13 @@ export class PageRouterOutlet implements OnDestroy {
105108 return this . _activatedRoute ;
106109 }
107110
111+ get activatedRouteData ( ) : Data {
112+ if ( this . _activatedRoute ) {
113+ return this . _activatedRoute . snapshot . data ;
114+ }
115+ return { } ;
116+ }
117+
108118 constructor (
109119 private parentContexts : ChildrenOutletContexts ,
110120 private location : ViewContainerRef ,
@@ -222,6 +232,7 @@ export class PageRouterOutlet implements OnDestroy {
222232 const component = this . activated ;
223233 this . activated = null ;
224234 this . _activatedRoute = null ;
235+ this . detachEvents . emit ( component . instance ) ;
225236 return component ;
226237 }
227238
@@ -245,6 +256,7 @@ export class PageRouterOutlet implements OnDestroy {
245256 if ( this . isFinalPageRouterOutlet ( ) ) {
246257 this . locationStrategy . _finishBackPageNavigation ( this . frame ) ;
247258 }
259+ this . attachEvents . emit ( ref . instance ) ;
248260 }
249261
250262 private isFinalPageRouterOutlet ( ) {
@@ -267,7 +279,7 @@ export class PageRouterOutlet implements OnDestroy {
267279 * This method in turn is responsible for calling the `routerOnActivate` hook of its child.
268280 */
269281 @profile
270- activateWith ( activatedRoute : ActivatedRoute , resolver : ComponentFactoryResolver | null ) : void {
282+ activateWith ( activatedRoute : ActivatedRoute , resolver : ComponentFactoryResolver | EnvironmentInjector | null ) : void {
271283 this . outlet = this . outlet || this . getOutlet ( activatedRoute . snapshot ) ;
272284 if ( ! this . outlet ) {
273285 if ( NativeScriptDebug . isLogEnabled ( ) ) {
@@ -302,12 +314,21 @@ export class PageRouterOutlet implements OnDestroy {
302314 this . activateEvents . emit ( this . activated . instance ) ;
303315 }
304316
305- private activateOnGoForward ( activatedRoute : ActivatedRoute , loadedResolver : ComponentFactoryResolver ) : void {
317+ private activateOnGoForward ( activatedRoute : ActivatedRoute , loadedResolver : ComponentFactoryResolver | EnvironmentInjector ) : void {
306318 if ( NativeScriptDebug . isLogEnabled ( ) ) {
307319 NativeScriptDebug . routerLog ( 'PageRouterOutlet.activate() forward navigation - ' + 'create detached loader in the loader container' ) ;
308320 }
309321
310- const factory = this . getComponentFactory ( activatedRoute , loadedResolver ) ;
322+ let resolver : ComponentFactoryResolver ;
323+ let ourInjector = this . location . injector ;
324+ if ( ! ( loadedResolver instanceof ComponentFactoryResolver ) ) {
325+ ourInjector = loadedResolver ;
326+ resolver = loadedResolver ?. get ( ComponentFactoryResolver ) ;
327+ } else {
328+ resolver = loadedResolver ;
329+ }
330+
331+ const factory = this . getComponentFactory ( activatedRoute , resolver ) ;
311332 const page = this . pageFactory ( {
312333 isNavigation : true ,
313334 componentType : factory . componentType ,
@@ -323,7 +344,7 @@ export class PageRouterOutlet implements OnDestroy {
323344 { provide : ChildrenOutletContexts , useValue : this . parentContexts . getOrCreateContext ( this . name ) . children } ,
324345 { provide : PageService , useClass : PageService } ,
325346 ] ,
326- parent : this . location . injector ,
347+ parent : ourInjector ,
327348 } ) ;
328349
329350 const childInjector = new DestructibleInjector ( destructables , injector ) ;
0 commit comments