Skip to content

Commit a34fd3b

Browse files
fix(resolve): Fix regression; Allow resolve values to be service names
closes #2588
1 parent adfbde3 commit a34fd3b

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

src/ng1.ts

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export * from "./core";
88

99
export * from "./ng1/services";
1010
export * from "./ng1/viewsBuilder";
11+
export * from "./ng1/resolvesBuilder";
1112

1213
import "./ng1/stateDirectives";
1314
import "./ng1/stateFilters";

src/ng1/resolvesBuilder.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/** @module ng1 */ /** */
2+
import {State} from "../state/stateObject";
3+
import {forEach} from "../common/common";
4+
import {isString} from "../common/predicates";
5+
6+
/**
7+
* This is a [[StateBuilder.builder]] function for angular1 `resolve:` block on a [[Ng1StateDeclaration]].
8+
*
9+
* When the [[StateBuilder]] builds a [[State]] object from a raw [[StateDeclaration]], this builder
10+
* handles the `resolve` property with logic specific to angular-ui-router (ng1).
11+
*/
12+
export function ng1ResolveBuilder(state: State) {
13+
let resolve = {};
14+
forEach(state.resolve || {}, function (resolveFn, name: string) {
15+
resolve[name] = isString(resolveFn) ? [ resolveFn, x => x ] : resolveFn;
16+
});
17+
return resolve;
18+
}

src/ng1/services.ts

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {State} from "../state/module";
2121
import {trace} from "../common/trace";
2222
import {ng1ViewsBuilder, ng1ViewConfigFactory, Ng1ViewConfig} from "./viewsBuilder";
2323
import {TemplateFactory} from "./templateFactory";
24+
import {ng1ResolveBuilder} from "./resolvesBuilder";
2425

2526
/** @hidden */
2627
let app = angular.module("ui.router.angular1", []);
@@ -160,6 +161,7 @@ function ng1UIRouter($locationProvider) {
160161

161162
// Apply ng1 `views` builder to the StateBuilder
162163
router.stateRegistry.decorator("views", ng1ViewsBuilder);
164+
router.stateRegistry.decorator("resolve", ng1ResolveBuilder);
163165

164166
router.viewService.viewConfigFactory('ng1', ng1ViewConfigFactory);
165167

test/stateSpec.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ describe('state helpers', function() {
8888
matcher = new StateMatcher(states);
8989
builder = new StateBuilder(matcher, urlMatcherFactoryProvider);
9090
builder.builder('views', uiRouter.ng1ViewsBuilder);
91+
builder.builder('resolve', uiRouter.ng1ResolveBuilder);
9192
});
9293

9394
describe('interface', function() {
@@ -177,7 +178,7 @@ describe('state helpers', function() {
177178
expect(urlMatcherFactoryProvider.isMatcher).toHaveBeenCalledWith({ foo: "bar" });
178179
});
179180

180-
it('should return a new views object, and copy keys, if no `views` is defined in the state def', function() {
181+
it('should return a new views object, and copy keys from state def, if no `views` is defined in the state def', function() {
181182
var parent = { name: "" };
182183
var config = { url: "/foo", templateUrl: "/foo.html", controller: "FooController", parent: parent };
183184
var built = builder.builder('views')(config);
@@ -191,6 +192,14 @@ describe('state helpers', function() {
191192
var config = { a: { foo: "bar", controller: "FooController" } };
192193
expect(builder.builder('views')({ parent: parent, views: config })).toEqual(config);
193194
});
195+
196+
it("should replace a resolve: string value with a function that injects the service of the same name", inject(function($injector) {
197+
var config = { resolve: { foo: "bar" } };
198+
var locals = { "bar": 123 };
199+
expect(builder.builder('resolve')).toBeDefined();
200+
var built = builder.builder('resolve')(config);
201+
expect($injector.invoke(built.foo, null, locals)).toBe(123);
202+
}));
194203
});
195204
});
196205

0 commit comments

Comments
 (0)