diff options
| author | Igor Minar | 2012-03-26 13:01:24 -0700 | 
|---|---|---|
| committer | Igor Minar | 2012-03-26 15:23:29 -0700 | 
| commit | d54dfecb00fba41455536c5ddd55310592fdaf84 (patch) | |
| tree | fa146933a2056b69c558f8e0bc0d15a315afeaaa /src | |
| parent | 4b8d926062eb4d4483555bdbdec4656f585ab40b (diff) | |
| download | angular.js-d54dfecb00fba41455536c5ddd55310592fdaf84.tar.bz2 | |
feat($controller): support controller registration via $controllerProvider
It's now possible to register controllers as:
.register('MyCtrl', function($scope) { ... });
// or
.register('MyCtrl', ['$scope', function($scope) { ... });
Additionally a module loader shortcut api was added as well:
myModule.controller('MyCtr', function($scope) { ... });
Diffstat (limited to 'src')
| -rw-r--r-- | src/loader.js | 13 | ||||
| -rw-r--r-- | src/service/controller.js | 51 | 
2 files changed, 55 insertions, 9 deletions
| diff --git a/src/loader.js b/src/loader.js index fdfdaebd..b25fc40e 100644 --- a/src/loader.js +++ b/src/loader.js @@ -167,7 +167,7 @@ function setupModuleLoader(window) {             * @ngdoc method             * @name angular.Module#filter             * @methodOf angular.Module -           * @param {string} name filter name +           * @param {string} name Filter name.             * @param {Function} filterFactory Factory function for creating new instance of filter.             * @description             * See {@link angular.module.ng.$filterProvider#register $filterProvider.register()}. @@ -176,6 +176,17 @@ function setupModuleLoader(window) {            /**             * @ngdoc method +           * @name angular.Module#controller +           * @methodOf angular.Module +           * @param {string} name Controller name. +           * @param {Function} constructor Controller constructor function. +           * @description +           * See {@link angular.module.ng.$controllerProvider#register $controllerProvider.register()}. +           */ +          controller: invokeLater('$controllerProvider', 'register'), + +          /** +           * @ngdoc method             * @name angular.Module#directive             * @methodOf angular.Module             * @param {string} name directive name diff --git a/src/service/controller.js b/src/service/controller.js index 229ce14a..fa90f8cd 100644 --- a/src/service/controller.js +++ b/src/service/controller.js @@ -1,6 +1,32 @@  'use strict'; +/** + * @ngdoc object + * @name angular.module.ng.$controllerProvider + * @description + * The {@link angular.module.ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link angular.module.ng.$controllerProvider#register register} method. + */  function $ControllerProvider() { +  var controllers = {}; + + +  /** +   * @ngdoc function +   * @name angular.module.ng.$controllerProvider#register +   * @methodOf angular.module.ng.$controllerProvider +   * @param {string} name Controller name +   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI +   *    annotations in the array notation). +   */ +  this.register = function(name, constructor) { +    controllers[name] = constructor; +  }; + +    this.$get = ['$injector', '$window', function($injector, $window) {      /** @@ -8,8 +34,14 @@ function $ControllerProvider() {       * @name angular.module.ng.$controller       * @requires $injector       * -     * @param {Function|string} Class Constructor function of a controller to instantiate, or -     *        expression to read from current scope or window. +     * @param {Function|string} constructor If called with a function then it's considered to be the +     *    controller constructor function. Otherwise it's considered to be a string which is used +     *    to retrieve the controller constructor using the following steps: +     * +     *    * check if a controller with given name is registered via `$controllerProvider` +     *    * check if evaluating the string on the current scope returns a constructor +     *    * check `window[constructor]` on the global `window` object +     *       * @param {Object} locals Injection locals for Controller.       * @return {Object} Instance of given controller.       * @@ -20,14 +52,17 @@ function $ControllerProvider() {       * a service, so that one can override this service with {@link https://gist.github.com/1649788       * BC version}.       */ -    return function(Class, locals) { -      if(isString(Class)) { -        var expression = Class; -        Class = getter(locals.$scope, expression, true) || getter($window, expression, true); -        assertArgFn(Class, expression); +    return function(constructor, locals) { +      if(isString(constructor)) { +        var name = constructor; +        constructor = controllers.hasOwnProperty(name) +            ? controllers[name] +            : getter(locals.$scope, name, true) || getter($window, name, true); + +        assertArgFn(constructor, name, true);        } -      return $injector.instantiate(Class, locals); +      return $injector.instantiate(constructor, locals);      };    }];  } | 
