解读AngularJS的setupModuleLoader函数
http://www.cnblogs.com/whitewolf/p/angular-module-declare-and-get.html
看了上面这篇文章,自己读了一下代码,以下是个人理解,如有请指正
/**
* Created by Administrator on 2016/10/15.
*/
function setupModuleLoader(window) {
//...省略部分代码 //注意angular.module('name',[require])为定义并获取一个新的模块
//而anguular.module('name')为获取一个已存在的模块 //判断对象obj是否存在name属性,存在则直接返回name,否则调用函数factory设置该属性,并返回该属性
function ensure(obj, name, factory) {
return obj[name] || (obj[name] = factory());
}
//确保window对象下存在angular属性
var angular = ensure(window, 'angular', Object);
//确保angular下存在module属性
return ensure(angular, 'module', function() {
var modules = {};
return function module(name, requires, configFn) {
//如果模块名为hasOwnProperty,报错:不是有效的名字
var assertNotHasOwnProperty = function(name, context) {
if (name === 'hasOwnProperty') {
throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
}
};
//保证模块名不是‘module’
assertNotHasOwnProperty(name, 'module');
//若为模块的定义,并且name与已存在的模块名重复,将原有的模块置空,即同名的模块将被后面定义的模块覆盖
if (requires && modules.hasOwnProperty(name)) {
modules[name] = null;
}
//若模块名已存在,则直接返回模块的实例,否则定义一个新模块
return ensure(modules, name, function() {
//要定义一个新的模块,却没有require参数,报错;注意require为[]表示定义,没有该参数表示获取
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);
}
var invokeQueue = [];
var runBlocks = [];
var config = invokeLater('$injector', 'invoke');
//模块实例
var moduleInstance = {
_invokeQueue: invokeQueue,
_runBlocks: runBlocks,
requires: requires,
name: name,
provider: invokeLater('$provide', 'provider'),
factory: invokeLater('$provide', 'factory'),
service: invokeLater('$provide', 'service'),
value: invokeLater('$provide', 'value'),
constant: invokeLater('$provide', 'constant', 'unshift'),
animation: invokeLater('$animateProvider', 'register'),
filter: invokeLater('$filterProvider', 'register'),
controller: invokeLater('$controllerProvider', 'register'),
directive: invokeLater('$compileProvider', 'directive'),
config: config,
run: function(block) {
runBlocks.push(block);
return this;
}
};
if (configFn) {
config(configFn);
}
return moduleInstance;
//invokeLater返回一个函数,该函数在利用module创建控制器、服务等时调用,向invokeQueue中推入数据,并返回模块的实例
//这就是为什么我们可以在angularJS中这样写
//angular.module('someMoudule',['require1'])
//.controller(...)
//.directive(...)
//而不用每次都写上模块名对应的变量名,就像下面这样
//var myapp=angular.module(...);
//myapp.controller(...);
//myaap.directive(...);
function invokeLater(provider, method, insertMethod) {
return function() {
invokeQueue[insertMethod || 'push']([provider, method, arguments]);
return moduleInstance;
};
}
});
};
});
}
解读AngularJS的setupModuleLoader函数的更多相关文章
- [Angularjs]常见api函数
写在前面 在angularjs中提供了一些常用的函数,比如angular.lowercase(),angular.uppercase(),angular.isString(),angular.isNu ...
- 【vue】vue生命周期解读 (流程+钩子函数)
参考详细说明一波简书 (vue中钩子函数解读) 1.实例渲染流程 2.生命周期钩子函数比 钩子函数详解简书一 钩子函数详解简书二
- 解读jQuery中extend函数
$.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...
- 详细解读Jquery各Ajax函数
$.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表,callba ...
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON() —(转)
一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...
- 解读ECMAScript 6箭头函数
箭头函数是ECMAScript 6最受关注的更新内容之一.它引入了一种用「箭头」(=>)来定义函数的新语法,它…它碉堡了~.箭头函数与传统的JavaScript函数主要区别在于以下几点: 对 t ...
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()【转】【补】
一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...
- h5移动端flexible源码适配终端解读以及常用sass函数
;(function(win, lib) { var doc = win.document;// win = window,lib = window.lib; var docEl = doc.docu ...
随机推荐
- Pytorch_第七篇_深度学习 (DeepLearning) 基础 [3]---梯度下降
深度学习 (DeepLearning) 基础 [3]---梯度下降法 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数" ...
- Bytom侧链Vapor源码浅析-节点出块过程
Bytom侧链Vapor源码浅析-节点出块过程 在这篇文章中,作者将从Vapor节点的创建开始,进而拓展讲解Vapor节点出块过程中所涉及的源码. 做为Vapor源码解析系列的第一篇,本文首先对Vap ...
- Faiss流程与原理分析
1.Faiss简介 Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库.它包含多种搜索任意大 ...
- 关于import android.support.v4.app.ContextCompat;找不到contextcompat的解决方法
android迁移到了androidx,那么相关库的import就有问题了,需要转变为androidx的,这里比如 import android.support.v4.app.ContextCompa ...
- 2020-04-08:谈一下IOC底层原理
Ioc的底层原理 (1)xml配置文件 (2)dom4j解析xml (3)工厂设计模式 (4)反射
- C#LeetCode刷题之#383-赎金信(Ransom Note)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3937 访问. 给定一个赎金信 (ransom) 字符串和一个杂志 ...
- C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3736 访问. 给定一个包含了一些 0 和 1的非空二维数组 gr ...
- VMware Workstation 15 Pro安装带图形化界面的CentOS7
1.双击打开“VMware Workstation”,然后选择“创建新的虚拟机” 2.在安装向导中,选择“稍后安装操作系统”,然后点击“下一步”继续安装 3.在“客户机操作系统”中选择“Linux(L ...
- IP-master
http://www.igotaobao.cn/IP-master/
- Python的序列数据和变量
本篇内容涉及字符串.列表.元组.Python中的报错,以及变量本质,包括引用计数技术 该篇只为抛砖引玉,其内容来自Python学习中总结,另外感谢李老师的教导和Python班同学们的帮助 附上李老师和 ...