Skip to content

Commit 421bca7

Browse files
BC-BREAK: Don't pass Injector as second arg to Trans Hooks.
1 parent 52f1308 commit 421bca7

18 files changed

+122
-174
lines changed

package.json

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,21 @@
33
"description": "State-based routing for Javascript",
44
"version": "1.0.0-alpha.5",
55
"scripts": {
6-
"test": "npm run test:core && npm run test:ng1",
7-
"test:watch": "node_modules/watch/cli.js 'npm run test' src test",
6+
"test": "npm run test:integrate",
7+
"watch": "node_modules/watch/cli.js 'npm run test' src test",
88

99
"test:core": "karma start config/karma.core.js",
10-
"test:core:debug": "karma start config/karma.core.js --singleRun=false --browsers=Chrome --autoWatch=true --autoWatchInterval=1",
10+
"debug:core": "karma start config/karma.core.js --singleRun=false --browsers=Chrome --autoWatch=true --autoWatchInterval=1",
1111

1212
"test:ng1": "karma start config/karma.ng15.js",
13-
"test:ng1:debug": "karma start config/karma.ng15.js --singleRun=false --browsers=Chrome --autoWatch=true --autoWatchInterval=1",
14-
"test:ng1:watch": "node_modules/watch/cli.js 'npm run test:ng1' src test",
13+
"debug:ng1": "karma start config/karma.ng15.js --singleRun=false --browsers=Chrome --autoWatch=true --autoWatchInterval=1",
14+
"watch:ng1": "node_modules/watch/cli.js 'npm run test:ng1' src test",
1515

1616
"test:ng12": "karma start config/karma.ng12.js",
1717
"test:ng13": "karma start config/karma.ng13.js",
1818
"test:ng14": "karma start config/karma.ng14.js",
1919
"test:ng15": "karma start config/karma.ng15.js",
20+
2021
"test:integrate": "tsc && npm run test:core && npm run test:ng12 && npm run test:ng13 && npm run test:ng14 && npm run test:ng15"
2122
},
2223
"homepage": "http://angular-ui.github.com/ui-router",

src/hooks/onEnterExitRetain.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/** @module state */ /** for typedoc */
22
import {TransitionStateHookFn} from "../transition/interface";
3-
import {UiInjector} from "../common/interface";
43
import {State} from "../state/stateObject";
54
import {Transition} from "../transition/transition";
65

76
export function makeEnterExitRetainHook(hookName: string): TransitionStateHookFn {
8-
return (transition: Transition, injector: UiInjector, state: State) =>
9-
state[hookName](transition, injector, state);
7+
return (transition: Transition, state: State) =>
8+
state[hookName](transition, state);
109
}

src/hooks/redirectTo.ts

+11-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import {isString, isFunction} from "../common/predicates"
2-
import {UiInjector} from "../common/interface";
32
import {Transition} from "../transition/transition";
4-
import {UiRouter} from "../router";
53
import {services} from "../common/coreservices";
64
import {TargetState} from "../state/targetState";
75

@@ -10,22 +8,21 @@ import {TargetState} from "../state/targetState";
108
*
119
* See [[StateDeclaration.redirectTo]]
1210
*/
13-
export const redirectToHook = (transition: Transition, $injector: UiInjector) => {
14-
let redirect = transition.to().redirectTo;
11+
export const redirectToHook = (trans: Transition) => {
12+
let redirect = trans.to().redirectTo;
1513
if (!redirect) return;
1614

17-
let router: UiRouter = $injector.get(UiRouter);
18-
let $state = router.stateService;
19-
20-
if (isFunction(redirect))
21-
return services.$q.when(redirect(transition, $injector)).then(handleResult);
22-
23-
return handleResult(redirect);
24-
2515
function handleResult(result) {
16+
let $state = trans.router.stateService;
17+
2618
if (result instanceof TargetState) return result;
27-
if (isString(result)) return $state.target(<any> result, transition.params(), transition.options());
19+
if (isString(result)) return $state.target(<any> result, trans.params(), trans.options());
2820
if (result['state'] || result['params'])
29-
return $state.target(result['state'] || transition.to(), result['params'] || transition.params(), transition.options());
21+
return $state.target(result['state'] || trans.to(), result['params'] || trans.params(), trans.options());
22+
}
23+
24+
if (isFunction(redirect)) {
25+
return services.$q.when(redirect(trans)).then(handleResult);
3026
}
27+
return handleResult(redirect);
3128
};

src/hooks/resolve.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@ import {ResolveContext} from "../resolve/resolveContext";
66

77
/** A function which resolves all EAGER Resolvables in the To Path */
88
export const $eagerResolvePath = (trans: Transition) =>
9-
new ResolveContext(trans.treeChanges().to).resolvePath("EAGER", trans).then(noop);
9+
new ResolveContext(trans.treeChanges().to)
10+
.resolvePath("EAGER", trans)
11+
.then(noop);
1012

1113
/** A function which resolves all LAZY Resolvables for the state (and all ancestors) in the To Path */
12-
export const $lazyResolveState = (trans: Transition, injector, state: State) =>
13-
new ResolveContext(trans.treeChanges().to).subContext(state).resolvePath("LAZY", trans).then(noop);
14+
export const $lazyResolveState = (trans: Transition, state: State) =>
15+
new ResolveContext(trans.treeChanges().to)
16+
.subContext(state)
17+
.resolvePath("LAZY", trans)
18+
.then(noop);
1419

src/hooks/url.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import {Transition} from "../transition/transition";
44
import {UiInjector} from "../common/interface";
55
import {UiRouter} from "../router";
66

7-
export function updateUrl(transition: Transition, injector: UiInjector) {
7+
export function updateUrl(transition: Transition) {
88
let options = transition.options();
9-
var router: UiRouter = injector.get(UiRouter);
10-
let $state: StateService = router.stateService;
11-
let $urlRouter: UrlRouter = router.urlRouter;
9+
let $state: StateService = transition.router.stateService;
10+
let $urlRouter: UrlRouter = transition.router.urlRouter;
1211

1312
if (options.location && $state.$current.navigable) {
1413
var urlOptions = {replace: options.location === 'replace'};

src/hooks/views.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import {services} from "../common/coreservices";
44
import {Transition} from "../transition/transition";
55
import {ViewService} from "../view/view";
66
import {ViewConfig} from "../view/interface";
7-
import {TransitionService} from "../transition/transitionService";
8-
import {UiInjector} from "../common/interface";
9-
import {UiRouter} from "../router";
107

118

129
/** Allows the views to do async work [.load()] before the transition continues */
@@ -16,12 +13,12 @@ export function loadEnteringViews(transition) {
1613
return services.$q.all(enteringViews.map(view => view.load())).then(noop);
1714
}
1815

19-
export function activateViews(transition: Transition, injector: UiInjector) {
16+
export function activateViews(transition: Transition) {
2017
let enteringViews = transition.views("entering");
2118
let exitingViews = transition.views("exiting");
2219
if (!enteringViews.length && !exitingViews.length) return;
2320

24-
let $view: ViewService = injector.get(UiRouter).viewService;
21+
let $view: ViewService = transition.router.viewService;
2522

2623
exitingViews.forEach((vc: ViewConfig) => $view.deactivateViewConfig(vc));
2724
enteringViews.forEach((vc: ViewConfig) => $view.activateViewConfig(vc));

src/ng1/legacy/stateEvents.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,11 @@ var $stateNotFound;
153153
return memo;
154154
}
155155

156-
function stateChangeStartHandler($transition$: Transition, $injector) {
156+
function stateChangeStartHandler($transition$: Transition) {
157157
if (!$transition$.options().notify || !$transition$.valid() || $transition$.ignored())
158158
return;
159159

160+
let $injector = $transition$.injector().native;
160161
let $stateEvents = $injector.get('$stateEvents');
161162
let $rootScope = $injector.get('$rootScope');
162163
let $state = $injector.get('$state');

src/ng1/services.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,21 @@
1313
import {UiRouter} from "../router";
1414
import {services} from "../common/coreservices";
1515
import {bindFunctions, removeFrom, applyPairs} from "../common/common";
16-
import {prop, propEq} from "../common/hof";
16+
import {prop} from "../common/hof";
1717
import {isObject, isString} from "../common/predicates";
18-
import {PathNode} from "../path/node";
1918
import {resolveFactory} from "./legacy/resolveService";
2019
import {trace} from "../common/trace";
21-
import {ng1ViewsBuilder, ng1ViewConfigFactory, Ng1ViewConfig} from "./statebuilders/views";
20+
import {ng1ViewsBuilder, ng1ViewConfigFactory} from "./statebuilders/views";
2221
import {TemplateFactory} from "./templateFactory";
2322
import {StateParams} from "../params/stateParams";
2423
import {TransitionService} from "../transition/transitionService";
2524
import {StateService} from "../state/stateService";
2625
import {StateProvider} from "../state/state";
2726
import {UrlRouterProvider, UrlRouter} from "../url/urlRouter";
2827
import {UrlMatcherFactory} from "../url/urlMatcherFactory";
29-
import {Transition} from "../transition/transition";
3028
import {getStateHookBuilder} from "./statebuilders/onEnterExitRetain";
3129
import {ResolveContext} from "../resolve/resolveContext";
30+
import IInjectorService = angular.auto.IInjectorService;
3231

3332
/** @hidden */
3433
let app = angular.module("ui.router.angular1", []);
@@ -284,6 +283,12 @@ export const getLocals = (ctx: ResolveContext) => {
284283
return tuples.reduce(applyPairs, {});
285284
};
286285

286+
declare module "../common/interface" {
287+
interface UiInjector {
288+
native: IInjectorService;
289+
}
290+
}
291+
287292
/** Injectable services */
288293

289294
/**

src/ng1/statebuilders/onEnterExitRetain.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {extend} from "../../common/common";
1818
export const getStateHookBuilder = (hookName) =>
1919
function stateHookBuilder(state: State, parentFn): TransitionStateHookFn {
2020
let hook = state[hookName];
21-
function decoratedNg1Hook(trans: Transition, inj: IInjectorService, state): HookResult {
21+
function decoratedNg1Hook(trans: Transition, state): HookResult {
2222
let resolveContext = new ResolveContext(trans.treeChanges().to);
2323
return services.$injector.invoke(hook, this, extend({ $state$: state }, getLocals(resolveContext)));
2424
}

src/resolve/resolveContext.ts

+3
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,7 @@ class UiInjectorImpl implements UiInjector {
186186
if (resolvable) return resolvable.get(this.context);
187187
return services.$q.when(services.$injector.get(token));
188188
}
189+
190+
/** The native injector ($injector on ng1, Root Injector on ng2, justjs injector for everything else) */
191+
native = services.$injector;
189192
}

src/state/interface.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -444,15 +444,15 @@ export interface StateDeclaration {
444444
* })
445445
* // a fn returning a promise for a redirect
446446
* .state('G', {
447-
* redirectTo: (trans, injector) => {
448-
* let svc = injector.get('SomeService')
449-
* let promise = svc.getAsyncRedirect(trans.params.foo);
447+
* redirectTo: (trans) => {
448+
* let svc = trans.injector().get('SomeAsyncService')
449+
* let promise = svc.getAsyncRedirectTo(trans.params.foo);
450450
* return promise;
451451
* }
452452
* })
453453
*/
454454
redirectTo?: (
455-
($transition$: Transition, $injector: UiInjector) => TargetState |
455+
($transition$: Transition) => TargetState |
456456
{ state: (string|StateDeclaration), params: { [key: string]: any }} |
457457
string
458458
)

src/transition/interface.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export type IHookRegistration = (matchCriteria: HookMatchCriteria, callback: Hoo
183183
* - [[IHookRegistry.onError]]
184184
*/
185185
export interface TransitionHookFn {
186-
(transition: Transition, injector: UiInjector) : HookResult
186+
(transition: Transition) : HookResult
187187
}
188188

189189
/**
@@ -208,7 +208,7 @@ export interface TransitionHookFn {
208208
* - [[IHookRegistry.onExit]]
209209
*/
210210
export interface TransitionStateHookFn {
211-
(transition: Transition, injector: UiInjector, state: State) : HookResult
211+
(transition: Transition, state: State) : HookResult
212212
}
213213

214214
export type HookFn = (TransitionHookFn|TransitionStateHookFn);

src/transition/transition.ts

+21-73
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { isObject, isArray } from "../common/predicates";
99
import { prop, propEq, val, not } from "../common/hof";
1010

1111
import {StateDeclaration, StateOrName} from "../state/interface";
12-
import {TransitionOptions, TransitionHookOptions, TreeChanges, IHookRegistry, IHookRegistration, IHookGetter} from "./interface";
12+
import {
13+
TransitionOptions, TransitionHookOptions, TreeChanges, IHookRegistry, IHookGetter,
14+
HookMatchCriteria, TransitionHookFn, TransitionStateHookFn, HookRegOptions
15+
} from "./interface";
1316

1417
import {TransitionHook} from "./transitionHook";
1518
import {HookRegistry, matchState} from "./hookRegistry";
@@ -65,78 +68,23 @@ export class Transition implements IHookRegistry {
6568
private _options: TransitionOptions;
6669
private _treeChanges: TreeChanges;
6770

68-
/**
69-
* Registers a callback function as an `onBefore` Transition Hook
70-
*
71-
* The hook is only registered for this specific `Transition`.
72-
* For global hooks, use [[TransitionService.onBefore]]
73-
*
74-
* See [[IHookRegistry.onBefore]]
75-
*/
76-
onBefore: IHookRegistration;
77-
/**
78-
* Registers a callback function as an `onStart` Transition Hook
79-
*
80-
* The hook is only registered for this specific `Transition`.
81-
* For global hooks, use [[TransitionService.onStart]]
82-
*
83-
* See [[IHookRegistry.onStart]]
84-
*/
85-
onStart: IHookRegistration;
86-
/**
87-
* Registers a callback function as an `onEnter` State Hook
88-
*
89-
* The hook is only registered for this specific `Transition`.
90-
* For global hooks, use [[TransitionService.onEnter]]
91-
*
92-
* See [[IHookRegistry.onEnter]]
93-
*/
94-
onEnter: IHookRegistration;
95-
/**
96-
* Registers a callback function as an `onRetain` State Hook
97-
*
98-
* The hook is only registered for this specific `Transition`.
99-
* For global hooks, use [[TransitionService.onRetain]]
100-
*
101-
* See [[IHookRegistry.onRetain]]
102-
*/
103-
onRetain: IHookRegistration;
104-
/**
105-
* Registers a callback function as an `onExit` State Hook
106-
*
107-
* The hook is only registered for this specific `Transition`.
108-
* For global hooks, use [[TransitionService.onExit]]
109-
*
110-
* See [[IHookRegistry.onExit]]
111-
*/
112-
onExit: IHookRegistration;
113-
/**
114-
* Registers a callback function as an `onFinish` Transition Hook
115-
*
116-
* The hook is only registered for this specific `Transition`.
117-
* For global hooks, use [[TransitionService.onFinish]]
118-
*
119-
* See [[IHookRegistry.onFinish]]
120-
*/
121-
onFinish: IHookRegistration;
122-
/**
123-
* Registers a callback function as an `onSuccess` Transition Hook
124-
*
125-
* The hook is only registered for this specific `Transition`.
126-
* For global hooks, use [[TransitionService.onSuccess]]
127-
*
128-
* See [[IHookRegistry.onSuccess]]
129-
*/
130-
onSuccess: IHookRegistration;
131-
/**
132-
* Registers a callback function as an `onError` Transition Hook
133-
*
134-
* The hook is only registered for this specific `Transition`.
135-
* For global hooks, use [[TransitionService.onError]]
136-
*
137-
* See [[IHookRegistry.onError]]
138-
*/
139-
onError: IHookRegistration;
71+
/** @inheritdoc */
72+
onBefore (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
73+
/** @inheritdoc */
74+
onStart (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
75+
/** @inheritdoc */
76+
onExit (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
77+
/** @inheritdoc */
78+
onRetain (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
79+
/** @inheritdoc */
80+
onEnter (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
81+
/** @inheritdoc */
82+
onFinish (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
83+
/** @inheritdoc */
84+
onSuccess (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
85+
/** @inheritdoc */
86+
onError (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
87+
14088
getHooks: IHookGetter;
14189

14290
/**

src/transition/transitionHook.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class TransitionHook {
4141
return Rejection.superseded(options.current()).toPromise();
4242
}
4343

44-
let hookResult = hookFn.call(options.bind, this.transition, resolveContext.injector(), this.stateContext);
44+
let hookResult = hookFn.call(options.bind, this.transition, this.stateContext);
4545
return this.handleHookResult(hookResult);
4646
}
4747

0 commit comments

Comments
 (0)