Skip to content

Commit e432c27

Browse files
feat(resolve): Allow all resolved data for a node to be injected as $resolve$
1 parent 7bbee8d commit e432c27

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/ng1/services.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -272,12 +272,16 @@ function getTransitionsProvider() {
272272
loadAllControllerLocals.$inject = ['$transition$'];
273273
function loadAllControllerLocals($transition$) {
274274
const loadLocals = (vc: ViewConfig) => {
275-
let deps = annotateController(vc.controller);
276-
let toPath: Node[] = $transition$.treeChanges().to;
277-
let resolveInjector = find(toPath, propEq('state', vc.context)).resolveInjector;
275+
let resolveCtx = find($transition$.treeChanges().to, propEq('state', vc.context)).resolveContext;
276+
let controllerDeps = annotateController(vc.controller);
277+
let resolvables = resolveCtx.getResolvables();
278+
278279
function $loadControllerLocals() { }
279-
$loadControllerLocals.$inject = deps;
280-
return services.$q.all(resolveInjector.getLocals($loadControllerLocals)).then((locals) => vc.locals = locals);
280+
$loadControllerLocals.$inject = controllerDeps.filter(dep => resolvables.hasOwnProperty(dep));
281+
// Load any controller resolves that aren't already loaded
282+
return resolveCtx.invokeLater($loadControllerLocals)
283+
// Then provide the view config with all the resolved data
284+
.then(() => vc.locals = map(resolvables, res => res.data));
281285
};
282286

283287
let loadAllLocals = $transition$.views("entering").filter(vc => !!vc.controller).map(loadLocals);

src/state/hooks/resolveHooks.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/** @module state */ /** for typedoc */
2-
import {extend, find, tail} from "../../common/common";
2+
import {extend, find, tail, map} from "../../common/common";
33
import {propEq} from "../../common/hof";
44

55
import {ResolvePolicy} from "../../resolve/interface";
66

77
import {Transition} from "../../transition/transition";
88
import {val} from "../../common/hof";
9+
import {Resolvable} from "../../resolve/resolvable";
910

1011

1112
let LAZY = ResolvePolicy[ResolvePolicy.LAZY];
@@ -33,7 +34,16 @@ export class ResolveHooks {
3334
(<any> $lazyResolveEnteringState).$inject = ['$state$', '$transition$'];
3435
function $lazyResolveEnteringState($state$, $transition$) {
3536
let node = find(<any[]> treeChanges.entering, propEq('state', $state$));
36-
return node.resolveContext.resolvePathElement(node.state, extend({transition: $transition$}, { resolvePolicy: LAZY }));
37+
38+
// A new Resolvable contains all the resolved data in this context as a single object, for injection as `$resolve$`
39+
let $resolve$ = new Resolvable("$resolve$", () => map(context.getResolvables(), r => r.data));
40+
let context = node.resolveContext;
41+
var options = extend({transition: $transition$}, { resolvePolicy: LAZY });
42+
43+
// Resolve all the LAZY resolves, then resolve the `$resolve$` object, then add `$resolve$` to the context
44+
return context.resolvePathElement(node.state, options)
45+
.then(() => $resolve$.resolveResolvable(context))
46+
.then(() => context.addResolvables({$resolve$}, node.state));
3747
}
3848

3949
// Resolve eager resolvables before when the transition starts

0 commit comments

Comments
 (0)