1
1
/** @coreapi @module transition */ /** for typedoc */
2
2
import {
3
- IHookRegistry , TransitionOptions , TransitionHookScope , TransitionHookPhase ,
4
- TransitionCreateHookFn
3
+ IHookRegistry , TransitionOptions , TransitionHookScope , TransitionHookPhase , TransitionCreateHookFn ,
4
+ HookMatchCriteria , HookRegOptions
5
5
} from "./interface" ;
6
-
7
- import {
8
- HookMatchCriteria , HookRegOptions , TransitionStateHookFn , TransitionHookFn
9
- } from "./interface" ; // has or is using
10
-
11
- import { Transition } from "./transition" ;
12
- import { RegisteredHooks , makeEvent , RegisteredHook } from "./hookRegistry" ;
13
- import { TargetState } from "../state/targetState" ;
14
- import { PathNode } from "../path/node" ;
15
- import { ViewService } from "../view/view" ;
16
- import { UIRouter } from "../router" ;
17
-
18
- import { registerEagerResolvePath , registerLazyResolveState } from "../hooks/resolve" ;
19
- import { registerLoadEnteringViews , registerActivateViews } from "../hooks/views" ;
20
- import { registerUpdateUrl } from "../hooks/url" ;
21
- import { registerRedirectToHook } from "../hooks/redirectTo" ;
22
- import { registerOnExitHook , registerOnRetainHook , registerOnEnterHook } from "../hooks/onEnterExitRetain" ;
23
- import { registerLazyLoadHook } from "../hooks/lazyLoad" ;
24
- import { TransitionEventType } from "./transitionEventType" ;
6
+ import { Transition } from "./transition" ;
7
+ import { RegisteredHooks , makeEvent , RegisteredHook , PathTypes , PathType } from "./hookRegistry" ;
8
+ import { TargetState } from "../state/targetState" ;
9
+ import { PathNode } from "../path/node" ;
10
+ import { ViewService } from "../view/view" ;
11
+ import { UIRouter } from "../router" ;
12
+ import { registerEagerResolvePath , registerLazyResolveState } from "../hooks/resolve" ;
13
+ import { registerLoadEnteringViews , registerActivateViews } from "../hooks/views" ;
14
+ import { registerUpdateUrl } from "../hooks/url" ;
15
+ import { registerRedirectToHook } from "../hooks/redirectTo" ;
16
+ import { registerOnExitHook , registerOnRetainHook , registerOnEnterHook } from "../hooks/onEnterExitRetain" ;
17
+ import { registerLazyLoadHook } from "../hooks/lazyLoad" ;
18
+ import { TransitionEventType } from "./transitionEventType" ;
25
19
import { TransitionHook , GetResultHandler , GetErrorHandler } from "./transitionHook" ;
26
- import { isDefined } from "../common/predicates" ;
20
+ import { isDefined } from "../common/predicates" ;
27
21
import { removeFrom , values , bindFunctions } from "../common/common" ;
28
- import { Disposable } from "../interface" ;
22
+ import { Disposable } from "../interface" ; // has or is using
29
23
30
24
/**
31
25
* The default [[Transition]] options.
@@ -45,6 +39,15 @@ export let defaultTransOpts: TransitionOptions = {
45
39
source : "unknown"
46
40
} ;
47
41
42
+
43
+ export interface TransitionServicePluginAPI {
44
+ _definePath ( name : string , hookScope : TransitionHookScope ) ;
45
+ _getPaths ( ) : PathTypes ;
46
+ _defineEvent ( hookType : TransitionEventType ) : void ;
47
+ _getEvents ( phase ?: TransitionHookPhase ) : TransitionEventType [ ] ;
48
+ getHooks ( hookName : string ) : RegisteredHook [ ] ;
49
+ }
50
+
48
51
/**
49
52
* This class provides services related to Transitions.
50
53
*
@@ -104,7 +107,17 @@ export class TransitionService implements IHookRegistry, Disposable {
104
107
/** @hidden The transition hook types, such as `onEnter`, `onStart`, etc */
105
108
private _eventTypes : TransitionEventType [ ] = [ ] ;
106
109
/** @hidden The registered transition hooks */
107
- _registeredHooks : RegisteredHooks = { } ;
110
+ _registeredHooks = { } as RegisteredHooks ;
111
+ /** @hidden The paths on a criteria object */
112
+ private _criteriaPaths = { } as PathTypes ;
113
+
114
+ _pluginapi = < TransitionServicePluginAPI > bindFunctions ( this , { } , this , [
115
+ '_definePath' ,
116
+ '_defineEvent' ,
117
+ '_getPaths' ,
118
+ '_getEvents' ,
119
+ 'getHooks' ,
120
+ ] ) ;
108
121
109
122
/**
110
123
* This object has hook de-registration functions for the built-in hooks.
@@ -128,8 +141,11 @@ export class TransitionService implements IHookRegistry, Disposable {
128
141
constructor ( private _router : UIRouter ) {
129
142
this . $view = _router . viewService ;
130
143
this . _deregisterHookFns = < any > { } ;
131
- this . registerTransitionHookTypes ( ) ;
132
- this . registerTransitionHooks ( ) ;
144
+
145
+ this . _defineDefaultPaths ( ) ;
146
+ this . _defineDefaultEvents ( ) ;
147
+
148
+ this . _registerDefaultTransitionHooks ( ) ;
133
149
}
134
150
135
151
/** @internalapi */
@@ -157,59 +173,62 @@ export class TransitionService implements IHookRegistry, Disposable {
157
173
}
158
174
159
175
/** @hidden */
160
- private registerTransitionHookTypes ( ) {
161
- const Scope = TransitionHookScope ;
176
+ private _defineDefaultEvents ( ) {
162
177
const Phase = TransitionHookPhase ;
163
178
const TH = TransitionHook ;
179
+ const paths = this . _criteriaPaths ;
164
180
165
- this . defineEvent ( "onCreate" , Phase . CREATE , Scope . TRANSITION , 0 , "to" , false , TH . IGNORE_RESULT , TH . THROW_ERROR , false ) ;
181
+ this . _defineEvent ( "onCreate" , Phase . CREATE , 0 , paths . to , false , TH . IGNORE_RESULT , TH . THROW_ERROR , false ) ;
166
182
167
- this . defineEvent ( "onBefore" , Phase . BEFORE , Scope . TRANSITION , 0 , "to" , false , TH . HANDLE_RESULT ) ;
183
+ this . _defineEvent ( "onBefore" , Phase . BEFORE , 0 , paths . to , false , TH . HANDLE_RESULT ) ;
168
184
169
- this . defineEvent ( "onStart" , Phase . ASYNC , Scope . TRANSITION , 0 , "to" ) ;
170
- this . defineEvent ( "onExit" , Phase . ASYNC , Scope . STATE , 100 , " exiting" , true ) ;
171
- this . defineEvent ( "onRetain" , Phase . ASYNC , Scope . STATE , 200 , " retained" ) ;
172
- this . defineEvent ( "onEnter" , Phase . ASYNC , Scope . STATE , 300 , " entering" ) ;
173
- this . defineEvent ( "onFinish" , Phase . ASYNC , Scope . TRANSITION , 400 , "to" ) ;
185
+ this . _defineEvent ( "onStart" , Phase . ASYNC , 0 , paths . to ) ;
186
+ this . _defineEvent ( "onExit" , Phase . ASYNC , 100 , paths . exiting , true ) ;
187
+ this . _defineEvent ( "onRetain" , Phase . ASYNC , 200 , paths . retained ) ;
188
+ this . _defineEvent ( "onEnter" , Phase . ASYNC , 300 , paths . entering ) ;
189
+ this . _defineEvent ( "onFinish" , Phase . ASYNC , 400 , paths . to ) ;
174
190
175
- this . defineEvent ( "onSuccess" , Phase . SUCCESS , Scope . TRANSITION , 0 , "to" , false , TH . IGNORE_RESULT , TH . LOG_ERROR , false ) ;
176
- this . defineEvent ( "onError" , Phase . ERROR , Scope . TRANSITION , 0 , "to" , false , TH . IGNORE_RESULT , TH . LOG_ERROR , false ) ;
191
+ this . _defineEvent ( "onSuccess" , Phase . SUCCESS , 0 , paths . to , false , TH . IGNORE_RESULT , TH . LOG_ERROR , false ) ;
192
+ this . _defineEvent ( "onError" , Phase . ERROR , 0 , paths . to , false , TH . IGNORE_RESULT , TH . LOG_ERROR , false ) ;
177
193
}
178
194
179
- _pluginapi = < TransitionServicePluginAPI > bindFunctions ( this , { } , this , [
180
- 'registerTransitionHookType' ,
181
- 'getTransitionEventTypes' ,
182
- 'getHooks' ,
183
- ] ) ;
195
+ /** @hidden */
196
+ private _defineDefaultPaths ( ) {
197
+ const { STATE , TRANSITION } = TransitionHookScope ;
198
+
199
+ this . _definePath ( "to" , TRANSITION ) ;
200
+ this . _definePath ( "from" , TRANSITION ) ;
201
+ this . _definePath ( "exiting" , STATE ) ;
202
+ this . _definePath ( "retained" , STATE ) ;
203
+ this . _definePath ( "entering" , STATE ) ;
204
+ }
184
205
185
206
/**
186
207
* Defines a transition hook type and returns a transition hook registration
187
208
* function (which can then be used to register hooks of this type).
188
209
* @internalapi
189
210
*/
190
- defineEvent ( name : string ,
191
- hookPhase : TransitionHookPhase ,
192
- hookScope : TransitionHookScope ,
193
- hookOrder : number ,
194
- criteriaMatchPath : string ,
195
- reverseSort : boolean = false ,
196
- getResultHandler : GetResultHandler = TransitionHook . HANDLE_RESULT ,
197
- getErrorHandler : GetErrorHandler = TransitionHook . REJECT_ERROR ,
198
- rejectIfSuperseded : boolean = true )
211
+ _defineEvent ( name : string ,
212
+ hookPhase : TransitionHookPhase ,
213
+ hookOrder : number ,
214
+ criteriaMatchPath : PathType ,
215
+ reverseSort : boolean = false ,
216
+ getResultHandler : GetResultHandler = TransitionHook . HANDLE_RESULT ,
217
+ getErrorHandler : GetErrorHandler = TransitionHook . REJECT_ERROR ,
218
+ rejectIfSuperseded : boolean = true )
199
219
{
200
- let eventType = new TransitionEventType ( name , hookPhase , hookScope , hookOrder , criteriaMatchPath , reverseSort , getResultHandler , getErrorHandler , rejectIfSuperseded ) ;
220
+ let eventType = new TransitionEventType ( name , hookPhase , hookOrder , criteriaMatchPath , reverseSort , getResultHandler , getErrorHandler , rejectIfSuperseded ) ;
201
221
202
222
this . _eventTypes . push ( eventType ) ;
203
223
makeEvent ( this , this , eventType ) ;
204
224
} ;
205
225
206
-
207
226
/**
208
227
* @hidden
209
228
* Returns the known event types, such as `onBefore`
210
229
* If a phase argument is provided, returns only events for the given phase.
211
230
*/
212
- private getTransitionEventTypes ( phase ?: TransitionHookPhase ) : TransitionEventType [ ] {
231
+ private _getEvents ( phase ?: TransitionHookPhase ) : TransitionEventType [ ] {
213
232
let transitionHookTypes = isDefined ( phase ) ?
214
233
this . _eventTypes . filter ( type => type . hookPhase === phase ) :
215
234
this . _eventTypes . slice ( ) ;
@@ -220,13 +239,39 @@ export class TransitionService implements IHookRegistry, Disposable {
220
239
} )
221
240
}
222
241
242
+ /**
243
+ * Adds a Path to be used as a criterion against a TreeChanges path
244
+ *
245
+ * For example: the `exiting` path in [[HookMatchCriteria]] is a STATE scoped path.
246
+ * It was defined by calling `defineTreeChangesCriterion('exiting', TransitionHookScope.STATE)`
247
+ * Each state in the exiting path is checked against the criteria and returned as part of the match.
248
+ *
249
+ * Another example: the `to` path in [[HookMatchCriteria]] is a TRANSITION scoped path.
250
+ * It was defined by calling `defineTreeChangesCriterion('to', TransitionHookScope.TRANSITION)`
251
+ * Only the tail of the `to` path is checked against the criteria and returned as part of the match.
252
+ *
253
+ * @internalapi
254
+ */
255
+ private _definePath ( name : string , hookScope : TransitionHookScope ) {
256
+ this . _criteriaPaths [ name ] = { name, scope : hookScope } ;
257
+ }
258
+
259
+ /**
260
+ * Gets a Path definition used as a criterion against a TreeChanges path
261
+ *
262
+ * @internalapi
263
+ */
264
+ private _getPaths ( ) : PathTypes {
265
+ return this . _criteriaPaths ;
266
+ }
267
+
223
268
/** @hidden */
224
269
public getHooks ( hookName : string ) : RegisteredHook [ ] {
225
270
return this . _registeredHooks [ hookName ] ;
226
271
}
227
272
228
273
/** @hidden */
229
- private registerTransitionHooks ( ) {
274
+ private _registerDefaultTransitionHooks ( ) {
230
275
let fns = this . _deregisterHookFns ;
231
276
232
277
// Wire up redirectTo hook
@@ -252,9 +297,3 @@ export class TransitionService implements IHookRegistry, Disposable {
252
297
fns . lazyLoad = registerLazyLoadHook ( this ) ;
253
298
}
254
299
}
255
-
256
- export interface TransitionServicePluginAPI {
257
- registerTransitionHookType ( hookType : TransitionEventType ) : void ;
258
- getTransitionEventTypes ( phase ?: TransitionHookPhase ) : TransitionEventType [ ] ;
259
- getHooks ( hookName : string ) : RegisteredHook [ ] ;
260
- }
0 commit comments