Skip to content

Commit 22a2b10

Browse files
committed
Merge pull request angular-ui#1934 from mezuka/resolve-for-template-provider
feat($state): Inject templateProvider with resolved values
2 parents eeb9c4e + afa20f2 commit 22a2b10

File tree

2 files changed

+48
-23
lines changed

2 files changed

+48
-23
lines changed

src/state.js

+30-22
Original file line numberDiff line numberDiff line change
@@ -1390,30 +1390,38 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
13901390
})];
13911391
if (inherited) promises.push(inherited);
13921392

1393-
// Resolve template and dependencies for all views.
1394-
forEach(state.views, function (view, name) {
1395-
var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
1396-
injectables.$template = [ function () {
1397-
return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || '';
1398-
}];
1399-
1400-
promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
1401-
// References to the controller (only instantiated at link time)
1402-
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
1403-
var injectLocals = angular.extend({}, injectables, locals, result);
1404-
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
1405-
} else {
1406-
result.$$controller = view.controller;
1407-
}
1408-
// Provide access to the state itself for internal use
1409-
result.$$state = state;
1410-
result.$$controllerAs = view.controllerAs;
1411-
dst[name] = result;
1412-
}));
1413-
});
1393+
function resolveViews() {
1394+
var viewsPromises = [];
1395+
1396+
// Resolve template and dependencies for all views.
1397+
forEach(state.views, function (view, name) {
1398+
var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
1399+
injectables.$template = [ function () {
1400+
return $view.load(name, { view: view, locals: dst.globals, params: $stateParams, notify: options.notify }) || '';
1401+
}];
1402+
1403+
viewsPromises.push($resolve.resolve(injectables, dst.globals, dst.resolve, state).then(function (result) {
1404+
// References to the controller (only instantiated at link time)
1405+
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
1406+
var injectLocals = angular.extend({}, injectables, dst.globals);
1407+
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
1408+
} else {
1409+
result.$$controller = view.controller;
1410+
}
1411+
// Provide access to the state itself for internal use
1412+
result.$$state = state;
1413+
result.$$controllerAs = view.controllerAs;
1414+
dst[name] = result;
1415+
}));
1416+
});
1417+
1418+
return $q.all(viewsPromises).then(function(){
1419+
return dst.globals;
1420+
});
1421+
}
14141422

14151423
// Wait for all the promises and then return the activation object
1416-
return $q.all(promises).then(function (values) {
1424+
return $q.all(promises).then(resolveViews).then(function (values) {
14171425
return dst;
14181426
});
14191427
}

test/stateSpec.js

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
describe('state', function () {
22

3-
var stateProvider, locationProvider, templateParams, ctrlName;
3+
var stateProvider, locationProvider, templateParams, ctrlName, template;
44

55
beforeEach(module('ui.router', function($locationProvider) {
66
locationProvider = $locationProvider;
@@ -80,6 +80,16 @@ describe('state', function () {
8080
foo: function() { return 'Foo'; }
8181
}
8282
})
83+
.state('dynamicTemplate', {
84+
url: "/dynamicTemplate/:type",
85+
templateProvider: function($stateParams, foo) {
86+
template = $stateParams.type + foo + "Template";
87+
return template;
88+
},
89+
resolve: {
90+
foo: function() { return 'Foo'; }
91+
}
92+
})
8393
.state('home.redirect', {
8494
url: "redir",
8595
onEnter: function($state) {
@@ -492,6 +502,12 @@ describe('state', function () {
492502
expect(ctrlName).toEqual("AcmeFooController");
493503
}));+
494504

505+
it('uses the templateProvider to get template dynamically', inject(function ($state, $q) {
506+
$state.transitionTo('dynamicTemplate', { type: "Acme" });
507+
$q.flush();
508+
expect(template).toEqual("AcmeFooTemplate");
509+
}));
510+
495511
it('updates the location #fragment, if specified', inject(function ($state, $q, $location) {
496512
// html5mode disabled
497513
locationProvider.html5Mode(false);
@@ -932,6 +948,7 @@ describe('state', function () {
932948
'badParam',
933949
'badParam2',
934950
'dynamicController',
951+
'dynamicTemplate',
935952
'first',
936953
'home',
937954
'home.item',

0 commit comments

Comments
 (0)