aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Injector.js25
-rw-r--r--src/loader.js13
-rw-r--r--test/InjectorSpec.js32
-rw-r--r--test/loaderSpec.js2
4 files changed, 69 insertions, 3 deletions
diff --git a/src/Injector.js b/src/Injector.js
index dc37a97c..10072959 100644
--- a/src/Injector.js
+++ b/src/Injector.js
@@ -230,7 +230,7 @@ function inferInjectionArgs(fn) {
*
* A short hand for configuring services if only `$get` method is required.
*
- * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key.
+ * @param {string} name The name of the instance.
* @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for
* `$provide.provider(name, {$get: $getFn})`.
* @returns {Object} registered provider instance
@@ -239,13 +239,27 @@ function inferInjectionArgs(fn) {
/**
* @ngdoc method
+ * @name angular.module.AUTO.$provide#service
+ * @methodOf angular.module.AUTO.$provide
+ * @description
+ *
+ * A short hand for registering service of given class.
+ *
+ * @param {string} name The name of the instance.
+ * @param {Function} constructor A class (constructor function) that will be instantiated.
+ * @returns {Object} registered provider instance
+ */
+
+
+/**
+ * @ngdoc method
* @name angular.module.AUTO.$provide#value
* @methodOf angular.module.AUTO.$provide
* @description
*
* A short hand for configuring services if the `$get` method is a constant.
*
- * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key.
+ * @param {string} name The name of the instance.
* @param {*} value The value.
* @returns {Object} registered provider instance
*/
@@ -296,6 +310,7 @@ function createInjector(modulesToLoad) {
$provide: {
provider: supportObject(provider),
factory: supportObject(factory),
+ service: supportObject(service),
value: supportObject(value),
constant: supportObject(constant),
decorator: decorator
@@ -342,6 +357,12 @@ function createInjector(modulesToLoad) {
function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }
+ function service(name, constructor) {
+ return factory(name, ['$injector', function($injector) {
+ return $injector.instantiate(constructor);
+ }]);
+ }
+
function value(name, value) { return factory(name, valueFn(value)); }
function constant(name, value) {
diff --git a/src/loader.js b/src/loader.js
index 3e5bffef..e5c5215a 100644
--- a/src/loader.js
+++ b/src/loader.js
@@ -125,12 +125,23 @@ function setupModuleLoader(window) {
* @param {string} name service name
* @param {Function} providerFunction Function for creating new instance of the service.
* @description
- * See {@link angular.module.AUTO.$provide#service $provide.factory()}.
+ * See {@link angular.module.AUTO.$provide#factory $provide.factory()}.
*/
factory: invokeLater('$provide', 'factory'),
/**
* @ngdoc method
+ * @name angular.Module#service
+ * @methodOf angular.Module
+ * @param {string} name service name
+ * @param {Function} constructor A constructor function that will be instantiated.
+ * @description
+ * See {@link angular.module.AUTO.$provide#service $provide.service()}.
+ */
+ service: invokeLater('$provide', 'service'),
+
+ /**
+ * @ngdoc method
* @name angular.Module#value
* @methodOf angular.Module
* @param {string} name service name
diff --git a/test/InjectorSpec.js b/test/InjectorSpec.js
index b0682b29..cc5c5b50 100644
--- a/test/InjectorSpec.js
+++ b/test/InjectorSpec.js
@@ -315,6 +315,38 @@ describe('injector', function() {
});
+ describe('service', function() {
+ it('should register a class', function() {
+ var Type = function(value) {
+ this.value = value;
+ };
+
+ var instance = createInjector([function($provide) {
+ $provide.value('value', 123);
+ $provide.service('foo', Type);
+ }]).get('foo');
+
+ expect(instance instanceof Type).toBe(true);
+ expect(instance.value).toBe(123);
+ });
+
+
+ it('should register a set of classes', function() {
+ var Type = function() {};
+
+ var injector = createInjector([function($provide) {
+ $provide.service({
+ foo: Type,
+ bar: Type
+ });
+ }]);
+
+ expect(injector.get('foo') instanceof Type).toBe(true);
+ expect(injector.get('bar') instanceof Type).toBe(true);
+ });
+ });
+
+
describe('provider', function() {
it('should configure $provide provider object', function() {
expect(createInjector([function($provide) {
diff --git a/test/loaderSpec.js b/test/loaderSpec.js
index ea1046f7..dff3787d 100644
--- a/test/loaderSpec.js
+++ b/test/loaderSpec.js
@@ -34,6 +34,7 @@ describe('module loader', function() {
expect(myModule.
provider('sk', 'sv').
factory('fk', 'fv').
+ service('a', 'aa').
value('k', 'v').
filter('f', 'ff').
directive('d', 'dd').
@@ -47,6 +48,7 @@ describe('module loader', function() {
['$injector', 'invoke', ['config'] ],
['$provide', 'provider', ['sk', 'sv'] ],
['$provide', 'factory', ['fk', 'fv'] ],
+ ['$provide', 'service', ['a', 'aa'] ],
['$provide', 'value', ['k', 'v'] ],
['$filterProvider', 'register', ['f', 'ff'] ],
['$compileProvider', 'directive', ['d', 'dd'] ],