[컴][자바스크립트] Angular js 초기화






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);
    }
}







댓글 없음:

댓글 쓰기