|
2 | 2 | import { Transition } from '../transition/transition';
|
3 | 3 | import { UIRouter } from '../router';
|
4 | 4 | import { TransitionService } from '../transition/transitionService';
|
| 5 | +import { Resolvable } from '../resolve'; |
| 6 | +import { extend, inArray, map, mapObj, unnestR, values } from '../common'; |
| 7 | +import { PathNode } from '../path'; |
| 8 | +import { TreeChanges } from "../transition"; |
5 | 9 |
|
6 | 10 | function addCoreResolvables(trans: Transition) {
|
7 |
| - trans.addResolvable({ token: UIRouter, deps: [], resolveFn: () => trans.router, data: trans.router }, ''); |
8 |
| - trans.addResolvable({ token: Transition, deps: [], resolveFn: () => trans, data: trans }, ''); |
9 |
| - trans.addResolvable({ token: '$transition$', deps: [], resolveFn: () => trans, data: trans }, ''); |
10 |
| - trans.addResolvable({ token: '$stateParams', deps: [], resolveFn: () => trans.params(), data: trans.params() }, ''); |
| 11 | + trans.addResolvable(Resolvable.fromData(UIRouter, trans.router), ''); |
| 12 | + trans.addResolvable(Resolvable.fromData(Transition, trans), ''); |
| 13 | + trans.addResolvable(Resolvable.fromData('$transition$', trans), ''); |
| 14 | + trans.addResolvable(Resolvable.fromData('$stateParams', trans.params()), ''); |
11 | 15 |
|
12 | 16 | trans.entering().forEach(state => {
|
13 |
| - trans.addResolvable({ token: '$state$', deps: [], resolveFn: () => state, data: state }, state); |
| 17 | + trans.addResolvable(Resolvable.fromData('$state$', state), state); |
14 | 18 | });
|
15 | 19 | }
|
16 | 20 |
|
17 | 21 | export const registerAddCoreResolvables = (transitionService: TransitionService) =>
|
18 | 22 | transitionService.onCreate({}, addCoreResolvables);
|
| 23 | + |
| 24 | +const TRANSITION_TOKENS = ['$transition$', Transition]; |
| 25 | +const isTransition = inArray(TRANSITION_TOKENS); |
| 26 | + |
| 27 | +// References to Transition in the treeChanges pathnodes makes all |
| 28 | +// previous Transitions reachable in memory, causing a memory leak |
| 29 | +// This function removes resolves for '$transition$' and `Transition` from the treeChanges. |
| 30 | +// Do not use this on current transitions, only on old ones. |
| 31 | +export const treeChangesCleanup = (trans: Transition) => { |
| 32 | + // If the resolvable is a Transition, return a new resolvable with null data |
| 33 | + const replaceTransitionWithNull = (r: Resolvable): Resolvable => |
| 34 | + isTransition(r.token) ? Resolvable.fromData(r.token, null) : r; |
| 35 | + |
| 36 | + const cleanPath = (path: PathNode[]) => path.map((node: PathNode) => { |
| 37 | + const resolvables = node.resolvables.map(replaceTransitionWithNull); |
| 38 | + return extend(node.clone(), { resolvables }); |
| 39 | + }); |
| 40 | + |
| 41 | + const treeChanges: TreeChanges = trans.treeChanges(); |
| 42 | + mapObj(treeChanges, cleanPath, treeChanges); |
| 43 | +}; |
0 commit comments