diff options
| author | Misko Hevery | 2012-01-06 18:10:47 -0800 |
|---|---|---|
| committer | Misko Hevery | 2012-01-10 22:27:00 -0800 |
| commit | 5143e7bf065a3cbdf8400cf095b653d51bc83b8f (patch) | |
| tree | 980149c365d4cb5586d27975d26366a25ff7be6a /src/loader.js | |
| parent | afd25446d23f24872eb20ac79c8fbd2cff203ef0 (diff) | |
| download | angular.js-5143e7bf065a3cbdf8400cf095b653d51bc83b8f.tar.bz2 | |
feat(module): new module loader
Diffstat (limited to 'src/loader.js')
| -rw-r--r-- | src/loader.js | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/loader.js b/src/loader.js new file mode 100644 index 00000000..ec30ad9a --- /dev/null +++ b/src/loader.js @@ -0,0 +1,167 @@ +'use strict'; + +/** + * @ngdoc interface + * @name angular.Module + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + return ensure(ensure(window, 'angular', Object), 'module', function() { + /** @type {Object.<string, angular.Module>} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @description + * + * The `angular.module` is a global place for registering angular modules. All modules + * (angular core or 3rd party) that should be available to an application must be registered using this mechanism. + * + * # Module + * + * A module is a collocation of services, directives, filters, and configure information. Module is used to configure the, + * {@link angular.module.AUTO.$injector $injector}. + * + * <pre> + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // configure a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.init(function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix = '!'; + * }); + * </pre> + * + * Then you can load your module like this: + * + * <pre> + * var injector = angular.injector('ng', 'MyModule') + * </pre> + * + * @param {!string} name The name of the module to create or retrieve. + * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the + * the module is being retrieved for further configuration. + * @param {Function} initFn Option configuration function for the module. Same as + * {@link angular.Module#init Module.init()}. + * @return {angular.Module} + */ + return function module(name, requires, initFn) { + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw Error('No module: ' + name); + } + + function init(fn) { + invokeQueue.push(['$injector', 'invoke', [null, fn]]); + } + + /** @type {!Array.<Array.<*>>} */ + var invokeQueue = []; + + /** @type {angular.Module} */ + var moduleInstance = { + /** + * @ngdoc property + * @name angular.Module#requires + * @propertyOf angular.Module + * @returns {Array.<string>} List of module names which must be loaded before this module. + * @description + * Holds the list of modules which the injector will load before the current module is loaded. + */ + requires: requires, + invokeQueue: invokeQueue, + + /** + * @ngdoc method + * @name angular.Module#service + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the service. + * @description + * See {@link angular.module.AUTO.$provide#service $provide.service()}. + */ + service: invokeLater('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @methodOf angular.Module + * @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()}. + */ + factory: invokeLater('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#value + * @methodOf angular.Module + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link angular.module.AUTO.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @methodOf angular.Module + * @param {string} name filterr name + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link angular.module.ng.$filterProvider#register $filterProvider.register()}. + */ + filter: invokeLater('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#init + * @methodOf angular.Module + * @param {Function} initializationFn Execute this function on module load, allowing it to do any + * service configuration.. + * @description + * Use this method to register work which needs to be performed on module loading. + */ + init: init + }; + + if (initFn) { + init(initFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLater(provider, method) { + return function() { + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + } + } + }); + }; + }); + +} |
