Skip to content

Commit c91b65a

Browse files
fix(onExit): inject resolve values using the "from path"
fix(onExit): inject the current transition as `$transition$` Closes #3081
1 parent 9d2661c commit c91b65a

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/ng1/statebuilders/onEnterExitRetain.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ import { getLocals } from "../services";
1414
export const getStateHookBuilder = (hookName: "onEnter"|"onExit"|"onRetain") =>
1515
function stateHookBuilder(state: State, parentFn: BuilderFunction): TransitionStateHookFn {
1616
let hook = state[hookName];
17+
let pathname = hookName === 'onExit' ? 'from' : 'to';
18+
1719
function decoratedNg1Hook(trans: Transition, state: State): HookResult {
18-
let resolveContext = new ResolveContext(trans.treeChanges().to);
19-
return services.$injector.invoke(hook, this, extend({ $state$: state }, getLocals(resolveContext)));
20+
let resolveContext = new ResolveContext(trans.treeChanges(pathname));
21+
var locals = extend(getLocals(resolveContext), { $state$: state, $transition$: trans });
22+
return services.$injector.invoke(hook, this, locals);
2023
}
2124

2225
return hook ? decoratedNg1Hook : undefined;

test/stateSpec.js

+29-2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ var html5Compat = require('./util/testUtilsNg1').html5Compat;
1111

1212
describe('state', function () {
1313

14-
var $injector, $stateProvider, locationProvider, templateParams, template, ctrlName, errors;
14+
var $uiRouter, $injector, $stateProvider, locationProvider, templateParams, template, ctrlName, errors;
1515

16-
beforeEach(module('ui.router', function($locationProvider) {
16+
beforeEach(module('ui.router', function($locationProvider, $uiRouterProvider) {
1717
errors = [];
1818
locationProvider = $locationProvider;
1919
$locationProvider.html5Mode(false);
20+
$uiRouter = $uiRouterProvider.router;
2021
}));
2122

2223
var log, logEvents, logEnterExit;
@@ -635,6 +636,32 @@ describe('state', function () {
635636
'A.onEnter;');
636637
}));
637638

639+
// test for #3081
640+
it('injects resolve values from the exited state into onExit', (function(done) {
641+
const registry = $uiRouter.stateRegistry;
642+
registry.register({
643+
name: 'design',
644+
url: '/design',
645+
resolve: { cc: function() { return 'cc resolve'; } },
646+
onExit: function(cc, $state$, $transition$) {
647+
expect($transition$.to().name).toBe('A');
648+
expect($transition$.from().name).toBe('design');
649+
650+
expect($state$.self).toBe(registry.get('design'));
651+
652+
expect(cc).toBe('cc resolve');
653+
654+
done();
655+
}
656+
});
657+
658+
$state.go("design");
659+
$q.flush();
660+
661+
$state.go("A");
662+
$q.flush();
663+
}));
664+
638665
it('doesn\'t transition to parent state when child has no URL', inject(function ($state, $q) {
639666
$state.transitionTo('about.sidebar'); $q.flush();
640667
expect($state.current.name).toEqual('about.sidebar');

0 commit comments

Comments
 (0)