Open leibnizli opened 8 years ago
config
、value
、factory
、server
、controller
等方法会向invokeQueue
队列中推入相关数组,在document发生DOMContentLoaded事件后启动angularInit
。
jqLite(document).ready(function() {
angularInit(document, bootstrap);
});
jqLite是一个类似jQuery的对象
function angularInit(element, bootstrap) {
//...
if (appElement) {
bootstrap(appElement, module ? [module] : [], config);
}
//...
}
angularInit中的bootstrap是一个函数,在angularInit中用来根据ng-app
初始化angular应用。bootstrap也可以用来手动启动angular应用,可以通过angular.bootstrap来访问
function bootstrap(element, modules, config) {
//...
}
手动启动angular应用
<!doctype html>
<html>
<body>
<div ng-controller="WelcomeController">
{{greeting}}
</div>
<script src="angular.js"></script>
<script>
var app = angular.module('demo', [])
.controller('WelcomeController', function($scope) {
$scope.greeting = 'Welcome!';
});
angular.bootstrap(document, ['demo']);
</script>
</body>
</html>
从源码入手
如同其他常见脚本框架一样,angular的核心代码包裹在一个自调用的匿名函数里边
在自调用匿名函数内部angular是一个对象,通过
publishExternalAPI
给angular对象赋值方法,angular.module通过setupModuleLoader
赋值。此处待放图片
angular.module返回一个module对象,下图是module对象的方法