diff options
| author | Misko Hevery | 2012-06-06 15:54:40 -0700 | 
|---|---|---|
| committer | Misko Hevery | 2013-04-22 23:28:41 -0700 | 
| commit | cd38cbf975b501d846e6149d1d993972a1af0053 (patch) | |
| tree | 3857a2879f782c6b7f1350fcd5c8d52e082fd160 /src/ng/controller.js | |
| parent | 021bdf3922b6525bd117e59fb4945b30a5a55341 (diff) | |
| download | angular.js-cd38cbf975b501d846e6149d1d993972a1af0053.tar.bz2 | |
feat(controller): support as instance syntax
Support ng-controller="MyController as my" syntax
which publishes the controller instance to the
current scope.
Also supports exporting a controller defined with route:
````javascript
angular.module('routes', [], function($routeProvider) {
  $routeProvider.when('/home', {controller: 'Ctrl as home', templateUrl: '...'});
});
````
Diffstat (limited to 'src/ng/controller.js')
| -rw-r--r-- | src/ng/controller.js | 34 | 
1 files changed, 25 insertions, 9 deletions
| diff --git a/src/ng/controller.js b/src/ng/controller.js index 0474e766..cfd730e4 100644 --- a/src/ng/controller.js +++ b/src/ng/controller.js @@ -11,7 +11,8 @@   * {@link ng.$controllerProvider#register register} method.   */  function $ControllerProvider() { -  var controllers = {}; +  var controllers = {}, +      CNTRL_REG = /^(\w+)(\s+as\s+(\w+))?$/;    /** @@ -56,17 +57,32 @@ function $ControllerProvider() {       * a service, so that one can override this service with {@link https://gist.github.com/1649788       * BC version}.       */ -    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); +    return function(expression, locals) { +      var instance, match, constructor, identifier; -        assertArgFn(constructor, name, true); +      if(isString(expression)) { +        match = expression.match(CNTRL_REG), +        constructor = match[1], +        identifier = match[3]; +        expression = controllers.hasOwnProperty(constructor) +            ? controllers[constructor] +            : getter(locals.$scope, constructor, true) || getter($window, constructor, true); + +        assertArgFn(expression, constructor, true); +      } + +      instance = $injector.instantiate(expression, locals); + +      if (identifier) { +        if (typeof locals.$scope !== 'object') { +          throw new Error('Can not export controller as "' + identifier + '". ' + +              'No scope object provided!'); +        } + +        locals.$scope[identifier] = instance;        } -      return $injector.instantiate(constructor, locals); +      return instance;      };    }];  } | 
