angular之moduler与服务等api生成。(angualr版本是1.2.28)
function setupModuleLoader(window) {
//得到 注入器异常与ng异常
var $injectorMinErr = minErr('$injector');
var ngMinErr = minErr('ng');
//方法属性绑定
function ensure(obj, name, factory) {
return obj[name] || (obj[name] = factory());
}
//绑定angular,到window上。
var angular = ensure(window, 'angular', Object);
//把minerr绑定到 angluar上
angular.$$minErr = angular.$$minErr || minErr;
//绑定 module方法到 angualr上,,,当你使用angular.module()的时候,实际上调用了 下面的 module方法
return ensure(angular, 'module', function() {
var modules = {};
//模块名,依赖关系, configFn,其实就等于 angular.module().config();
return function module(name, requires, configFn) {
var assertNotHasOwnProperty = function(name, context) {
if (name === 'hasOwnProperty') {
throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
}
};
//排除hasOwnProperty,
assertNotHasOwnProperty(name, 'module');
if (requires && modules.hasOwnProperty(name)) {
modules[name] = null;
}
return ensure(modules, name, function() {
if (!requires) {
throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
"the module name or forgot to load it. If registering a module ensure that you " +
"specify the dependencies as the second argument.", name);
}
//这个数组保存 除 run之外所有 方法的操作
/** @type {!Array.<Array.<*>>} */
var invokeQueue = [];
//保存 run方法的执行
/** @type {!Array.<Function>} */
var runBlocks = [];
//提前实例化 config方法
var config = invokeLater('$injector', 'invoke');
/** @type {angular.Module} */
var moduleInstance = {
// Private state
_invokeQueue: invokeQueue,
_runBlocks: runBlocks,
requires: requires,
name: name,
provider: invokeLater('$provide', 'provider'),
service: invokeLater('$provide', 'service'),
animation: invokeLater('$animateProvider', 'register'),
config: config,
run: function(block) {
runBlocks.push(block);
return this;
}
};
if (configFn) {
config(configFn);
}
//执行完module 方法,返回的是这个对象
return moduleInstance;
//这个方法很关键,provider的名字,初始化方法。
function invokeLater(provider, method, insertMethod) {
//基本每个 方法 实际执行的这个 方法。
return function() {
invokeQueue[insertMethod || 'push']([provider, method, arguments]);
return moduleInstance;
};
}
});
};
});
}
本文深入解析Angular 1.2.28版本中模块加载机制的实现细节,包括如何定义和注册模块、配置注入器及执行模块配置过程。通过具体代码展示了Angular内部如何处理模块依赖及其配置。
2700

被折叠的 条评论
为什么被折叠?



