diff --git a/src/ng1.ts b/src/ng1.ts index 8b94d930c..d70e546d4 100644 --- a/src/ng1.ts +++ b/src/ng1.ts @@ -8,6 +8,7 @@ export * from "./core"; export * from "./ng1/services"; export * from "./ng1/viewsBuilder"; +export * from "./ng1/resolvesBuilder"; import "./ng1/stateDirectives"; import "./ng1/stateFilters"; diff --git a/src/ng1/resolvesBuilder.ts b/src/ng1/resolvesBuilder.ts new file mode 100644 index 000000000..88e839e4b --- /dev/null +++ b/src/ng1/resolvesBuilder.ts @@ -0,0 +1,18 @@ +/** @module ng1 */ /** */ +import {State} from "../state/stateObject"; +import {forEach} from "../common/common"; +import {isString} from "../common/predicates"; + +/** + * This is a [[StateBuilder.builder]] function for angular1 `resolve:` block on a [[Ng1StateDeclaration]]. + * + * When the [[StateBuilder]] builds a [[State]] object from a raw [[StateDeclaration]], this builder + * handles the `resolve` property with logic specific to angular-ui-router (ng1). + */ +export function ng1ResolveBuilder(state: State) { + let resolve = {}; + forEach(state.resolve || {}, function (resolveFn, name: string) { + resolve[name] = isString(resolveFn) ? [ resolveFn, x => x ] : resolveFn; + }); + return resolve; +} diff --git a/src/ng1/services.ts b/src/ng1/services.ts index 0af5564f7..4fe5b9d03 100644 --- a/src/ng1/services.ts +++ b/src/ng1/services.ts @@ -21,6 +21,7 @@ import {State} from "../state/module"; import {trace} from "../common/trace"; import {ng1ViewsBuilder, ng1ViewConfigFactory, Ng1ViewConfig} from "./viewsBuilder"; import {TemplateFactory} from "./templateFactory"; +import {ng1ResolveBuilder} from "./resolvesBuilder"; /** @hidden */ let app = angular.module("ui.router.angular1", []); @@ -160,6 +161,7 @@ function ng1UIRouter($locationProvider) { // Apply ng1 `views` builder to the StateBuilder router.stateRegistry.decorator("views", ng1ViewsBuilder); + router.stateRegistry.decorator("resolve", ng1ResolveBuilder); router.viewService.viewConfigFactory('ng1', ng1ViewConfigFactory); diff --git a/test/stateSpec.js b/test/stateSpec.js index f95e89e5e..fb1decf66 100644 --- a/test/stateSpec.js +++ b/test/stateSpec.js @@ -88,6 +88,7 @@ describe('state helpers', function() { matcher = new StateMatcher(states); builder = new StateBuilder(matcher, urlMatcherFactoryProvider); builder.builder('views', uiRouter.ng1ViewsBuilder); + builder.builder('resolve', uiRouter.ng1ResolveBuilder); }); describe('interface', function() { @@ -177,7 +178,7 @@ describe('state helpers', function() { expect(urlMatcherFactoryProvider.isMatcher).toHaveBeenCalledWith({ foo: "bar" }); }); - it('should return a new views object, and copy keys, if no `views` is defined in the state def', function() { + it('should return a new views object, and copy keys from state def, if no `views` is defined in the state def', function() { var parent = { name: "" }; var config = { url: "/foo", templateUrl: "/foo.html", controller: "FooController", parent: parent }; var built = builder.builder('views')(config); @@ -191,6 +192,14 @@ describe('state helpers', function() { var config = { a: { foo: "bar", controller: "FooController" } }; expect(builder.builder('views')({ parent: parent, views: config })).toEqual(config); }); + + it("should replace a resolve: string value with a function that injects the service of the same name", inject(function($injector) { + var config = { resolve: { foo: "bar" } }; + var locals = { "bar": 123 }; + expect(builder.builder('resolve')).toBeDefined(); + var built = builder.builder('resolve')(config); + expect($injector.invoke(built.foo, null, locals)).toBe(123); + })); }); });