11/** @module state */ /** for typedoc */
2- import { copy } from "../../common/common" ;
32import { prop } from "../../common/hof" ;
4- import { Queue } from "../../common/queue" ;
53import { Param } from "../../params/param" ;
64
75import { TreeChanges } from "../../transition/interface" ;
@@ -15,6 +13,8 @@ import {ViewHooks} from "./viewHooks";
1513import { EnterExitHooks } from "./enterExitHooks" ;
1614import { ResolveHooks } from "./resolveHooks" ;
1715import { UrlRouter } from "../../url/urlRouter" ;
16+ import { services } from "../../common/coreservices" ;
17+ import { UIRouterGlobals } from "../../globals" ;
1818
1919/**
2020 * This class:
@@ -38,18 +38,17 @@ export class TransitionManager {
3838 private enterExitHooks : EnterExitHooks ;
3939 private viewHooks : ViewHooks ;
4040 private resolveHooks : ResolveHooks ;
41+ private $q ;
4142
4243 constructor (
4344 private transition : Transition ,
4445 private $transitions ,
4546 private $urlRouter : UrlRouter ,
4647 private $view , // service
4748 private $state : StateService ,
48- private $stateParams , // service/obj
49- private $q , // TODO: get from runtime.$q
50- private activeTransQ : Queue < Transition > ,
51- private changeHistory : Queue < TreeChanges >
49+ private globals : UIRouterGlobals
5250 ) {
51+ this . $q = services . $q ;
5352 this . viewHooks = new ViewHooks ( transition , $view ) ;
5453 this . enterExitHooks = new EnterExitHooks ( transition ) ;
5554 this . resolveHooks = new ResolveHooks ( transition ) ;
@@ -63,45 +62,26 @@ export class TransitionManager {
6362 }
6463
6564 runTransition ( ) : Promise < any > {
66- this . activeTransQ . clear ( ) ; // TODO: nuke this
67- this . activeTransQ . enqueue ( this . transition ) ;
68- this . $state . transition = this . transition ;
69- let promise = this . transition . run ( )
65+ this . globals . transitionHistory . enqueue ( this . transition ) ;
66+ return this . transition . run ( )
7067 . then ( ( trans : Transition ) => trans . to ( ) ) // resolve to the final state (TODO: good? bad?)
7168 . catch ( error => this . transRejected ( error ) ) ; // if rejected, handle dynamic and redirect
72-
73- let always = ( ) => {
74- this . activeTransQ . remove ( this . transition ) ;
75- if ( this . $state . transition === this . transition ) this . transition = null ;
76- } ;
77-
78- promise . then ( always , always ) ;
79-
80- return promise ;
8169 }
8270
8371 registerUpdateGlobalState ( ) {
84- this . transition . onFinish ( { } , this . updateGlobalState . bind ( this ) , { priority : - 10000 } ) ;
85- }
86-
87- updateGlobalState ( ) {
88- let { treeChanges, transition, $state, changeHistory} = this ;
89- // Update globals in $state
90- $state . $current = transition . $to ( ) ;
91- $state . current = $state . $current . self ;
92- changeHistory . enqueue ( treeChanges ) ;
93- this . updateStateParams ( ) ;
72+ // After globals.current is updated at priority: 10000
73+ this . transition . onSuccess ( { } , this . updateUrl . bind ( this ) , { priority : 9999 } ) ;
9474 }
9575
9676 transRejected ( error ) : ( StateDeclaration | Promise < any > ) {
97- let { transition, $state, $stateParams , $ q} = this ;
77+ let { transition, $state, $q} = this ;
9878 // Handle redirect and abort
9979 if ( error instanceof TransitionRejection ) {
10080 if ( error . type === RejectType . IGNORED ) {
10181 // Update $stateParmas/$state.params/$location.url if transition ignored, but dynamic params have changed.
10282 let dynamic = $state . $current . parameters ( ) . filter ( prop ( 'dynamic' ) ) ;
103- if ( ! Param . equals ( dynamic , $stateParams , transition . params ( ) ) ) {
104- this . updateStateParams ( ) ;
83+ if ( ! Param . equals ( dynamic , $state . params , transition . params ( ) ) ) {
84+ this . updateUrl ( ) ;
10585 }
10686 return $state . current ;
10787 }
@@ -120,22 +100,20 @@ export class TransitionManager {
120100 return $q . reject ( error ) ;
121101 }
122102
123- updateStateParams ( ) {
103+ updateUrl ( ) {
124104 let transition = this . transition ;
125- let { $urlRouter, $state, $stateParams } = this ;
105+ let { $urlRouter, $state} = this ;
126106 let options = transition . options ( ) ;
127- copy ( transition . params ( ) , $state . params ) ;
128- copy ( $state . params , $stateParams ) ;
107+ var toState = transition . $to ( ) ;
129108
130109 if ( options . location && $state . $current . navigable ) {
131- $urlRouter . push ( $state . $current . navigable . url , $stateParams , { replace : options . location === 'replace' } ) ;
110+ $urlRouter . push ( $state . $current . navigable . url , $state . params , { replace : options . location === 'replace' } ) ;
132111 }
133-
134112 $urlRouter . update ( true ) ;
135113 }
136114
137115 private _redirectMgr ( redirect : Transition ) : TransitionManager {
138- let { $transitions, $urlRouter, $view, $state, $stateParams , $q , activeTransQ , changeHistory } = this ;
139- return new TransitionManager ( redirect , $transitions , $urlRouter , $view , $state , $stateParams , $q , activeTransQ , changeHistory ) ;
116+ let { $transitions, $urlRouter, $view, $state, globals } = this ;
117+ return new TransitionManager ( redirect , $transitions , $urlRouter , $view , $state , globals ) ;
140118 }
141119}
0 commit comments