Skip to content

Commit afa20f2

Browse files
committed
feat($state): Inject templateProvider with resolved values
1 parent da63b27 commit afa20f2

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;
@@ -78,6 +78,16 @@ describe('state', function () {
7878
foo: function() { return 'Foo'; }
7979
}
8080
})
81+
.state('dynamicTemplate', {
82+
url: "/dynamicTemplate/:type",
83+
templateProvider: function($stateParams, foo) {
84+
template = $stateParams.type + foo + "Template";
85+
return template;
86+
},
87+
resolve: {
88+
foo: function() { return 'Foo'; }
89+
}
90+
})
8191
.state('home.redirect', {
8292
url: "redir",
8393
onEnter: function($state) {
@@ -490,6 +500,12 @@ describe('state', function () {
490500
expect(ctrlName).toEqual("AcmeFooController");
491501
}));+
492502

503+
it('uses the templateProvider to get template dynamically', inject(function ($state, $q) {
504+
$state.transitionTo('dynamicTemplate', { type: "Acme" });
505+
$q.flush();
506+
expect(template).toEqual("AcmeFooTemplate");
507+
}));
508+
493509
it('updates the location #fragment, if specified', inject(function ($state, $q, $location) {
494510
// html5mode disabled
495511
locationProvider.html5Mode(false);
@@ -929,6 +945,7 @@ describe('state', function () {
929945
'badParam',
930946
'badParam2',
931947
'dynamicController',
948+
'dynamicTemplate',
932949
'first',
933950
'home',
934951
'home.item',

0 commit comments

Comments
 (0)