Angular JS 의 초기화, provider 호출까지
jqLite(document).ready(function() {
angularInit(document, bootstrap);
});
angularInit(document, bootstrap);
...
names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'];
forEach(names, function(name) {
// ngApp 녀석들 elements 에 append
})
// elements 는 ng-app 에 해당하는 녀석들의 list
forEach(elements, function(element) {
// module 에 ng-app 에 적힌 이름을 넣는다.
if (!appElement) {
...
if (match) {
appElement = element;
module = (match[2] || '').replace(/\s+/g, ',');
} else {
forEach(element.attributes, function(attr) {
if (!appElement && names[attr.name]) {
appElement = element;
module = attr.value;
}
});
}
}
})
if (appElement) {
bootstrap(appElement, module ? [module] : []);
}
function bootstrap(element, modules) {
...
if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
return doBootstrap();
}
// doBootstrap()
...
modules.unshift(['$provide', function($provide) {
$provide.value('$rootElement', element);
}]);
modules.unshift('ng');
var injector = createInjector(modules);
}
function createInjector(modulesToLoad) {
providerInjector = (providerCache.$injector =
createInternalInjector(providerCache, function() {
throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
})),
forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
function loadModules(modulesToLoad){
...
forEach(modulesToLoad, function(module) {
...
try {
if (isString(module)) {
moduleFn = angularModule(module);
runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
for(invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
var invokeArgs = invokeQueue[i],
provider = providerInjector.get(invokeArgs[0]);
provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
}
} ...
}...
})
}
// fn example
// [["$stateProvider", function config($stateProvider)]]
function invoke(fn, self, locals){
var args = [],
$inject = annotate(fn),
...
for(i = 0, length = $inject.length; i < length; i++) {
...
}
if (isArray(fn)) {
fn = fn[length];
}
// http://jsperf.com/angularjs-invoke-apply-vs-switch
// #5388
// 각종 provider 이 호출 됨.
return fn.apply(self, args);
}
}
댓글 없음:
댓글 쓰기