aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--angularFiles.js1
-rw-r--r--src/AngularPublic.js1
-rw-r--r--src/directives.js4
-rw-r--r--src/service/controller.js26
-rw-r--r--src/service/formFactory.js6
-rw-r--r--src/service/route.js6
-rw-r--r--test/service/controllerSpec.js38
7 files changed, 74 insertions, 8 deletions
diff --git a/angularFiles.js b/angularFiles.js
index e2a37bb5..05f93bf8 100644
--- a/angularFiles.js
+++ b/angularFiles.js
@@ -13,6 +13,7 @@ angularFiles = {
'src/service/browser.js',
'src/service/cacheFactory.js',
'src/service/compiler.js',
+ 'src/service/controller.js',
'src/service/cookieStore.js',
'src/service/cookies.js',
'src/service/defer.js',
diff --git a/src/AngularPublic.js b/src/AngularPublic.js
index 3614eb9a..bfc50ef8 100644
--- a/src/AngularPublic.js
+++ b/src/AngularPublic.js
@@ -70,6 +70,7 @@ function publishExternalAPI(angular){
$provide.service('$browser', $BrowserProvider);
$provide.service('$cacheFactory', $CacheFactoryProvider);
$provide.service('$compile', $CompileProvider);
+ $provide.service('$controller', $ControllerProvider);
$provide.service('$cookies', $CookiesProvider);
$provide.service('$cookieStore', $CookieStoreProvider);
$provide.service('$defer', $DeferProvider);
diff --git a/src/directives.js b/src/directives.js
index 61bb6139..e9b678f8 100644
--- a/src/directives.js
+++ b/src/directives.js
@@ -160,12 +160,12 @@ angularDirective("ng:init", function(expression){
*/
angularDirective("ng:controller", function(expression) {
this.scope(true);
- return ['$injector', '$window', function($injector, $window) {
+ return ['$controller', '$window', function($controller, $window) {
var scope = this,
Controller = getter(scope, expression, true) || getter($window, expression, true);
assertArgFn(Controller, expression);
- $injector.instantiate(Controller, {$scope: scope});
+ $controller(Controller, scope);
}];
});
diff --git a/src/service/controller.js b/src/service/controller.js
new file mode 100644
index 00000000..22fb3b02
--- /dev/null
+++ b/src/service/controller.js
@@ -0,0 +1,26 @@
+'use strict';
+
+function $ControllerProvider() {
+ this.$get = ['$injector', function($injector) {
+
+ /**
+ * @ngdoc function
+ * @name angular.module.ng.$controller
+ * @requires $injector
+ *
+ * @param {Function} Class Constructor function of a controller to instantiate.
+ * @param {Object} scope Related scope.
+ * @return {Object} Instance of given controller.
+ *
+ * @description
+ * `$controller` service is responsible for instantiating controllers.
+ *
+ * It's just simple call to {@link angular.module.AUTO.$injector $injector}, but extracted into
+ * a service, so that one can override this service with {@link https://gist.github.com/1649788
+ * BC version}.
+ */
+ return function(Class, scope) {
+ return $injector.instantiate(Class, {$scope: scope});
+ };
+ }];
+}
diff --git a/src/service/formFactory.js b/src/service/formFactory.js
index 5d64131e..69c6d717 100644
--- a/src/service/formFactory.js
+++ b/src/service/formFactory.js
@@ -102,8 +102,8 @@
function $FormFactoryProvider() {
var $parse;
- this.$get = ['$rootScope', '$parse', '$injector',
- function($rootScope, $parse_, $injector) {
+ this.$get = ['$rootScope', '$parse', '$controller',
+ function($rootScope, $parse_, $controller) {
$parse = $parse_;
/**
* @ngdoc proprety
@@ -136,7 +136,7 @@ function $FormFactoryProvider() {
function formFactory(parent) {
var scope = (parent || formFactory.rootForm).$new();
- $injector.instantiate(FormController, {$scope: scope});
+ $controller(FormController, scope);
return scope;
}
diff --git a/src/service/route.js b/src/service/route.js
index 04bcfdb6..f8200fd4 100644
--- a/src/service/route.js
+++ b/src/service/route.js
@@ -63,8 +63,8 @@
</doc:example>
*/
function $RouteProvider(){
- this.$get = ['$rootScope', '$location', '$routeParams', '$injector',
- function( $rootScope, $location, $routeParams, $injector) {
+ this.$get = ['$rootScope', '$location', '$routeParams', '$controller',
+ function( $rootScope, $location, $routeParams, $controller) {
/**
* @ngdoc event
* @name angular.module.ng.$route#$beforeRouteChange
@@ -280,7 +280,7 @@ function $RouteProvider(){
copy(next.params, $routeParams);
next.scope = parentScope.$new();
if (next.controller) {
- $injector.instantiate(next.controller, {$scope: next.scope});
+ $controller(next.controller, next.scope);
}
}
}
diff --git a/test/service/controllerSpec.js b/test/service/controllerSpec.js
new file mode 100644
index 00000000..8b12eceb
--- /dev/null
+++ b/test/service/controllerSpec.js
@@ -0,0 +1,38 @@
+'use strict';
+
+describe('$controller', function() {
+ var $controller;
+
+ beforeEach(inject(function($injector) {
+ $controller = $injector.get('$controller');
+ }));
+
+ it('should return instance of given controller class', function() {
+ var MyClass = function() {},
+ ctrl = $controller(MyClass);
+
+ expect(ctrl).toBeDefined();
+ expect(ctrl instanceof MyClass).toBe(true);
+ });
+
+ it('should inject arguments', inject(function($http) {
+ var MyClass = function($http) {
+ this.$http = $http;
+ };
+
+ var ctrl = $controller(MyClass);
+ expect(ctrl.$http).toBe($http);
+ }));
+
+
+ it('should inject given scope', function() {
+ var MyClass = function($scope) {
+ this.$scope = $scope;
+ };
+
+ var scope = {},
+ ctrl = $controller(MyClass, scope);
+
+ expect(ctrl.$scope).toBe(scope);
+ });
+});