aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Ramón López2012-11-03 21:11:07 +0100
committerMisko Hevery2013-01-18 21:20:49 -0800
commitfaf02f0c4db7962f863b0da2a82c8cafab2c706f (patch)
tree9602f0d265d47ee0018a03654cee0f68b1c83488
parentb8bd4d5460d9952e9a3bb14992636b17859bd457 (diff)
downloadangular.js-faf02f0c4db7962f863b0da2a82c8cafab2c706f.tar.bz2
feat(route): Allow using functions as template params in 'when'
-rw-r--r--src/ng/route.js35
-rw-r--r--test/ng/routeSpec.js47
2 files changed, 75 insertions, 7 deletions
diff --git a/src/ng/route.js b/src/ng/route.js
index 91e4adb3..971caa1c 100644
--- a/src/ng/route.js
+++ b/src/ng/route.js
@@ -35,12 +35,24 @@ function $RouteProvider(){
* - `controller` – `{(string|function()=}` – Controller fn that should be associated with newly
* created scope or the name of a {@link angular.Module#controller registered controller}
* if passed as a string.
- * - `template` – `{string=}` – html template as a string that should be used by
- * {@link ng.directive:ngView ngView} or
+ * - `template` – `{string=|function()=}` – html template as a string or function that returns
+ * an html template as a string which should be used by {@link ng.directive:ngView ngView} or
* {@link ng.directive:ngInclude ngInclude} directives.
- * this property takes precedence over `templateUrl`.
- * - `templateUrl` – `{string=}` – path to an html template that should be used by
- * {@link ng.directive:ngView ngView}.
+ * This property takes precedence over `templateUrl`.
+ *
+ * If `template` is a function, it will be called with the following parameters:
+ *
+ * - `{Array.<Object>}` - route parameters extracted from the current
+ * `$location.path()` by applying the current route
+ *
+ * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
+ * template that should be used by {@link ng.directive:ngView ngView}.
+ *
+ * If `templateUrl` is a function, it will be called with the following parameters:
+ *
+ * - `{Array.<Object>}` - route parameters extracted from the current
+ * `$location.path()` by applying the current route
+ *
* - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
* be injected into the controller. If any of these dependencies are promises, they will be
* resolved and converted to a value before the controller is instantiated and the
@@ -395,9 +407,18 @@ function $RouteProvider(){
values.push(isString(value) ? $injector.get(value) : $injector.invoke(value));
});
if (isDefined(template = next.template)) {
+ if (isFunction(template)) {
+ template = template(next.params);
+ }
} else if (isDefined(template = next.templateUrl)) {
- template = $http.get(template, {cache: $templateCache}).
- then(function(response) { return response.data; });
+ if (isFunction(template)) {
+ template = template(next.params);
+ }
+ if (isDefined(template)) {
+ next.loadedTemplateUrl = template;
+ template = $http.get(template, {cache: $templateCache}).
+ then(function(response) { return response.data; });
+ }
}
if (isDefined(template)) {
keys.push('$template');
diff --git a/test/ng/routeSpec.js b/test/ng/routeSpec.js
index 852f97b5..e8e63b77 100644
--- a/test/ng/routeSpec.js
+++ b/test/ng/routeSpec.js
@@ -715,6 +715,53 @@ describe('$route', function() {
});
+ it('should allow using a function as a template', function() {
+ var customTemplateWatcher = jasmine.createSpy('customTemplateWatcher');
+
+ function customTemplateFn(routePathParams) {
+ customTemplateWatcher(routePathParams);
+ expect(routePathParams).toEqual({id: 'id3'});
+ return '<h1>' + routePathParams.id + '</h1>';
+ }
+
+ module(function($routeProvider){
+ $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});
+ $routeProvider.when('/foo/:id', {template: customTemplateFn});
+ });
+
+ inject(function($route, $location, $rootScope) {
+ $location.path('/foo/id3');
+ $rootScope.$digest();
+
+ expect(customTemplateWatcher).toHaveBeenCalledWith({id: 'id3'});
+ });
+ });
+
+
+ it('should allow using a function as a templateUrl', function() {
+ var customTemplateUrlWatcher = jasmine.createSpy('customTemplateUrlWatcher');
+
+ function customTemplateUrlFn(routePathParams) {
+ customTemplateUrlWatcher(routePathParams);
+ expect(routePathParams).toEqual({id: 'id3'});
+ return 'foo.html';
+ }
+
+ module(function($routeProvider){
+ $routeProvider.when('/bar/:id/:subid/:subsubid', {templateUrl: 'bar.html'});
+ $routeProvider.when('/foo/:id', {templateUrl: customTemplateUrlFn});
+ });
+
+ inject(function($route, $location, $rootScope) {
+ $location.path('/foo/id3');
+ $rootScope.$digest();
+
+ expect(customTemplateUrlWatcher).toHaveBeenCalledWith({id: 'id3'});
+ expect($route.current.loadedTemplateUrl).toEqual('foo.html');
+ });
+ });
+
+
describe('reload', function() {
it('should reload even if reloadOnSearch is false', function() {