@@ -6,12 +6,12 @@ import { extend, removeFrom, tail, values, identity, map } from "../common/commo
6
6
import { isString , isFunction } from "../common/predicates" ;
7
7
import { PathNode } from "../path/pathNode" ;
8
8
import {
9
- TransitionStateHookFn , TransitionHookFn , TransitionHookPhase , TransitionHookScope , IHookRegistry , PathType
9
+ TransitionStateHookFn , TransitionHookFn , TransitionHookPhase , TransitionHookScope , IHookRegistry , PathType ,
10
10
} from "./interface" ; // has or is using
11
11
12
12
import {
13
13
HookRegOptions , HookMatchCriteria , TreeChanges ,
14
- HookMatchCriterion , IMatchingNodes , HookFn
14
+ HookMatchCriterion , IMatchingNodes , HookFn ,
15
15
} from "./interface" ;
16
16
import { Glob } from "../common/glob" ;
17
17
import { StateObject } from "../state/stateObject" ;
@@ -57,16 +57,19 @@ export function matchState(state: StateObject, criterion: HookMatchCriterion) {
57
57
export class RegisteredHook {
58
58
priority : number ;
59
59
bind : any ;
60
- _deregistered : boolean ;
60
+ invokeCount = 0 ;
61
+ invokeLimit : number ;
62
+ _deregistered = false ;
61
63
62
64
constructor ( public tranSvc : TransitionService ,
63
65
public eventType : TransitionEventType ,
64
66
public callback : HookFn ,
65
67
public matchCriteria : HookMatchCriteria ,
68
+ public removeHookFromRegistry : ( hook : RegisteredHook ) => void ,
66
69
options : HookRegOptions = { } as any ) {
67
70
this . priority = options . priority || 0 ;
68
71
this . bind = options . bind || null ;
69
- this . _deregistered = false ;
72
+ this . invokeLimit = options . invokeLimit ;
70
73
}
71
74
72
75
/**
@@ -152,26 +155,28 @@ export class RegisteredHook {
152
155
let allMatched = values ( matches ) . every ( identity ) ;
153
156
return allMatched ? matches : null ;
154
157
}
158
+
159
+ deregister ( ) {
160
+ this . removeHookFromRegistry ( this ) ;
161
+ this . _deregistered = true ;
162
+ }
155
163
}
156
164
157
165
/** @hidden Return a registration function of the requested type. */
158
166
export function makeEvent ( registry : IHookRegistry , transitionService : TransitionService , eventType : TransitionEventType ) {
159
167
// Create the object which holds the registered transition hooks.
160
- let _registeredHooks = registry . _registeredHooks = ( registry . _registeredHooks || { } ) ;
161
- let hooks = _registeredHooks [ eventType . name ] = [ ] ;
168
+ const _registeredHooks = registry . _registeredHooks = ( registry . _registeredHooks || { } ) ;
169
+ const hooks = _registeredHooks [ eventType . name ] = [ ] ;
170
+ const removeHookFn : ( hook : RegisteredHook ) => void = removeFrom ( hooks ) ;
162
171
163
172
// Create hook registration function on the IHookRegistry for the event
164
173
registry [ eventType . name ] = hookRegistrationFn ;
165
174
166
175
function hookRegistrationFn ( matchObject , callback , options = { } ) {
167
- let registeredHook = new RegisteredHook ( transitionService , eventType , callback , matchObject , options ) ;
176
+ const registeredHook = new RegisteredHook ( transitionService , eventType , callback , matchObject , removeHookFn , options ) ;
168
177
hooks . push ( registeredHook ) ;
169
-
170
- return function deregisterEventHook ( ) {
171
- registeredHook . _deregistered = true ;
172
- removeFrom ( hooks ) ( registeredHook ) ;
173
- } ;
178
+ return registeredHook . deregister . bind ( registeredHook ) ;
174
179
}
175
180
176
181
return hookRegistrationFn ;
177
- }
182
+ }
0 commit comments