@@ -3,6 +3,7 @@ import { document } from 'ssr-window';
33import Utils from '../../utils/utils' ;
44import History from '../../utils/history' ;
55import redirect from './redirect' ;
6+ import preRoute from './pre-route' ;
67
78function refreshPage ( ) {
89 const router = this ;
@@ -539,54 +540,86 @@ function navigate(navigateParams, navigateOptions = {}) {
539540 return redirect . call ( router , 'navigate' , route , navigateOptions ) ;
540541 }
541542
543+
542544 const options = { } ;
543545 if ( route . route . options ) {
544546 Utils . extend ( options , route . route . options , navigateOptions , { route } ) ;
545547 } else {
546548 Utils . extend ( options , navigateOptions , { route } ) ;
547549 }
550+
548551 if ( options && options . context ) {
549552 route . context = options . context ;
550553 options . route . context = options . context ;
551554 }
552- ( 'popup popover sheet loginScreen actions customModal' ) . split ( ' ' ) . forEach ( ( modalLoadProp ) => {
553- if ( route . route [ modalLoadProp ] ) {
554- router . modalLoad ( modalLoadProp , route , options ) ;
555- }
556- } ) ;
557- ( 'url content component pageName el componentUrl template templateUrl' ) . split ( ' ' ) . forEach ( ( pageLoadProp ) => {
558- if ( route . route [ pageLoadProp ] ) {
559- router . load ( { [ pageLoadProp ] : route . route [ pageLoadProp ] } , options ) ;
560- }
561- } ) ;
562- // Async
563- function asyncResolve ( resolveParams , resolveOptions ) {
564- router . allowPageChange = false ;
565- let resolvedAsModal = false ;
566- if ( resolveOptions && resolveOptions . context ) {
567- if ( ! route . context ) route . context = resolveOptions . context ;
568- else route . context = Utils . extend ( { } , route . context , resolveOptions . context ) ;
569- options . route . context = route . context ;
570- }
555+
556+ function resolve ( ) {
557+ let routerLoaded = false ;
571558 ( 'popup popover sheet loginScreen actions customModal' ) . split ( ' ' ) . forEach ( ( modalLoadProp ) => {
572- if ( resolveParams [ modalLoadProp ] ) {
573- resolvedAsModal = true ;
574- const modalRoute = Utils . extend ( { } , route , { route : resolveParams } ) ;
575- router . allowPageChange = true ;
576- router . modalLoad ( modalLoadProp , modalRoute , Utils . extend ( options , resolveOptions ) ) ;
559+ if ( route . route [ modalLoadProp ] && ! routerLoaded ) {
560+ routerLoaded = true ;
561+ router . modalLoad ( modalLoadProp , route , options ) ;
562+ }
563+ } ) ;
564+ ( 'url content component pageName el componentUrl template templateUrl' ) . split ( ' ' ) . forEach ( ( pageLoadProp ) => {
565+ if ( route . route [ pageLoadProp ] && ! routerLoaded ) {
566+ routerLoaded = true ;
567+ router . load ( { [ pageLoadProp ] : route . route [ pageLoadProp ] } , options ) ;
577568 }
578569 } ) ;
579- if ( resolvedAsModal ) return ;
580- router . load ( resolveParams , Utils . extend ( options , resolveOptions ) , true ) ;
570+ if ( routerLoaded ) return ;
571+ // Async
572+ function asyncResolve ( resolveParams , resolveOptions ) {
573+ router . allowPageChange = false ;
574+ let resolvedAsModal = false ;
575+ if ( resolveOptions && resolveOptions . context ) {
576+ if ( ! route . context ) route . context = resolveOptions . context ;
577+ else route . context = Utils . extend ( { } , route . context , resolveOptions . context ) ;
578+ options . route . context = route . context ;
579+ }
580+ ( 'popup popover sheet loginScreen actions customModal' ) . split ( ' ' ) . forEach ( ( modalLoadProp ) => {
581+ if ( resolveParams [ modalLoadProp ] ) {
582+ resolvedAsModal = true ;
583+ const modalRoute = Utils . extend ( { } , route , { route : resolveParams } ) ;
584+ router . allowPageChange = true ;
585+ router . modalLoad ( modalLoadProp , modalRoute , Utils . extend ( options , resolveOptions ) ) ;
586+ }
587+ } ) ;
588+ if ( resolvedAsModal ) return ;
589+ router . load ( resolveParams , Utils . extend ( options , resolveOptions ) , true ) ;
590+ }
591+ function asyncReject ( ) {
592+ router . allowPageChange = true ;
593+ }
594+ if ( route . route . async ) {
595+ router . allowPageChange = false ;
596+
597+ route . route . async . call ( router , route , router . currentRoute , asyncResolve , asyncReject ) ;
598+ }
581599 }
582- function asyncReject ( ) {
600+ function reject ( ) {
583601 router . allowPageChange = true ;
584602 }
585- if ( route . route . async ) {
586- router . allowPageChange = false ;
587603
588- route . route . async . call ( router , route , router . currentRoute , asyncResolve , asyncReject ) ;
604+ if ( router . params . preRoute || route . route . preRoute ) {
605+ router . allowPageChange = false ;
606+ preRoute . call (
607+ router ,
608+ route . route . preRoute ,
609+ route ,
610+ router . currentRoute ,
611+ ( ) => {
612+ router . allowPageChange = true ;
613+ resolve ( ) ;
614+ } ,
615+ ( ) => {
616+ reject ( ) ;
617+ } ,
618+ ) ;
619+ } else {
620+ resolve ( ) ;
589621 }
622+
590623 // Return Router
591624 return router ;
592625}
0 commit comments