1.angular 初始化流程 function(window, document, undefined) { //定位到4939行,这里是angularjs开始执行初始化的地方,见代码 styleDirective = valueFn({ restrict: "E", terminal: !0 }); bindJQuery(), publishExternalAPI(angular), jqLite(document).ready(function() { angularInit(document, bootstrap) }) //bindJQuery方法是检查是否引用jquery,没有的话jqlite就用本身自带的,否则切换到jquery中去.这个好理解 publishExternalAPI这个方法是绑定一些公共的方法到angular下面,这些是可以在网站中访问到的,像forEach,copy等公共方法,还有一个重要的任务就是初始化angular核心的模块,publishExternalAPI在465行,现在我们来分析里面的一些重要的代码 }(window, document), !angular.$$csp() && //个人理解为此处angular的标志变量未定义 //下面就是为将angular找到head 对一些指令追加css样式 angular.element(document).find("head").prepend(‘<style type="text/css">@charset "UTF-8"; [ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}. ng-animate-start{clip:rect(0,auto,auto,0);-ms-zoom:1.0001;}. ng-animate-active{clip:rect(-1px,auto,auto,0);-ms-zoom:1;}</style>‘); /“”“”“”“”“”“”“”“”“”完成jquery绑定“”“”“”“”“”“”“”“”“”“”“”/ function bindJQuery() { jQuery = window.jQuery, jQuery ? (jqLite = jQuery, extend(jQuery.fn, { //如果没有未引用jquery 就使用angular jQlite 库 scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData }), jqLitePatchJQueryRemove("remove", !0, !0, !1), jqLitePatchJQueryRemove("empty", !1, !1, !1), jqLitePatchJQueryRemove("html", !1, !1, !0)) : jqLite = JQLite, angular.element = jqLite } /**********************追加公共方法*****************************/ function publishExternalAPI(angular) { extend(angular, { bootstrap: bootstrap, copy: copy, extend: extend, equals: equals, element: jqLite, forEach: forEach, injector: createInjector, noop: noop, bind: bind, toJson: toJson, fromJson: fromJson, identity: identity, isUndefined: isUndefined, isDefined: isDefined, isString: isString, isFunction: isFunction, isObject: isObject, isNumber: isNumber, isElement: isElement, isArray: isArray, version: version, isDate: isDate, lowercase: lowercase, uppercase: uppercase, callbacks: { counter: 0 }, $$minErr: minErr, $$csp: csp }), angularModule = setupModuleLoader(window); try { angularModule("ngLocale") } catch (e) { angularModule("ngLocale", []).provider("$locale", $LocaleProvider) } angularModule("ng", ["ngLocale"], ["$provide", function($provide) { $provide.provider("$compile", $CompileProvider).directive({ a: htmlAnchorDirective, input: inputDirective, textarea: inputDirective, form: formDirective, script: scriptDirective, select: selectDirective, style: styleDirective, option: optionDirective, ngBind: ngBindDirective, ngBindHtml: ngBindHtmlDirective, ngBindTemplate: ngBindTemplateDirective, ngClass: ngClassDirective, ngClassEven: ngClassEvenDirective, ngClassOdd: ngClassOddDirective, ngCloak: ngCloakDirective, ngController: ngControllerDirective, ngForm: ngFormDirective, ngHide: ngHideDirective, ngIf: ngIfDirective, ngInclude: ngIncludeDirective, ngInit: ngInitDirective, ngNonBindable: ngNonBindableDirective, ngPluralize: ngPluralizeDirective, ngRepeat: ngRepeatDirective, ngShow: ngShowDirective, ngStyle: ngStyleDirective, ngSwitch: ngSwitchDirective, ngSwitchWhen: ngSwitchWhenDirective, ngSwitchDefault: ngSwitchDefaultDirective, ngOptions: ngOptionsDirective, ngTransclude: ngTranscludeDirective, ngModel: ngModelDirective, ngList: ngListDirective, ngChange: ngChangeDirective, required: requiredDirective, ngRequired: requiredDirective, ngValue: ngValueDirective }).directive(ngAttributeAliasDirectives).directive(ngEventDirectives), $provide.provider({ $anchorScroll: $AnchorScrollProvider, $animate: $AnimateProvider, $browser: $BrowserProvider, $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, $document: $DocumentProvider, $exceptionHandler: $ExceptionHandlerProvider, $filter: $FilterProvider, $interpolate: $InterpolateProvider, $interval: $IntervalProvider, $http: $HttpProvider, $httpBackend: $HttpBackendProvider, $location: $LocationProvider, $log: $LogProvider, $parse: $ParseProvider, $rootScope: $RootScopeProvider, $q: $QProvider, $sce: $SceProvider, $sceDelegate: $SceDelegateProvider, $sniffer: $SnifferProvider, $templateCache: $TemplateCacheProvider, $timeout: $TimeoutProvider, $window: $WindowProvider }) } ]) } 方法体中的setupModuleLoader方法是一个模块加载器,这也是一个关键方法, 主要作用是创建和获取模块,代码见417行 function setupModuleLoader(window) { function ensure(obj, name, factory) { return obj[name] || (obj[name] = factory()) } var $injectorMinErr = minErr("$injector"), ngMinErr = minErr("ng"); return ensure(ensure(window, "angular", Object), "module", function() { var modules = {}; return function(name, requires, configFn) { var assertNotHasOwnProperty = function(name, context) { if ("hasOwnProperty" === name) throw ngMinErr("badname", "hasOwnProperty is not a valid {0} name", context) }; return assertNotHasOwnProperty(name, "module"), requires && modules.hasOwnProperty(name) && (modules[name] = null), ensure(modules, name, function() { function invokeLater(provider, method, insertMethod) { return function() { return invokeQueue[insertMethod || "push"]([provider, method, arguments]), moduleInstance } } 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 = [], runBlocks = [], config = invokeLater("$injector", "invoke"), 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) { return runBlocks.push(block), this } }; return configFn && config(configFn), moduleInstance }) } }) } 上面publishExternalAPI 方法中的angularModule = setupModuleLoader(window);是在window下面创建全局的angular对象,并且返回一个高阶函数,赋值给了angular.module属性,所以一般我们创建模块都是用angular.module方法.这里的angularModule其实就是相当于angular.module angular.module在创建模块的时候,传递一个参数的时候,是获取模块;传递一个以上的是创建新模块;该方法返回的是一个moduleInstance对象,它的任务就是来创建控制器,服务,指令,以及配置方法,全局运行方法,而且是链式调用,因为每个方法都会返回moduleInstance,看这里
时间: 2024-10-11 20:40:50