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; }; }]; } |
