마

angularjs 1.4.5의 분석

· 2015-09-12 (토) 03:06:40 · 2533 · 2

1. 브라우저가 Angular.js 파일을 읽고 실행한다.

2. DOM Content Loaded Event 트리거를 기다린다.

[code]

// check if document is already loaded

    if (document.readyState === 'complete') {

      setTimeout(trigger);

    } else {

      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9

      // we can not use jqLite since we are not done loading and jQuery could be loaded later.

      // jshint -W064

      JQLite(window).on('load', trigger); // fallback to window.onload for others

      // jshint +W064

    } 

[/code]

3. 트리거가 오면 Angularinit을 실행한다. 

[code]

  jqLite(document).ready(function() {

    angularInit(document, bootstrap);

  }); 

[/code]

4. anuglarinit에서 HTML구조를 파싱해서 ng-app을 찾는 것 같습니다. ng-, data-ng-, ng:, x-ng- 네개의 프리픽스를 찾아보네요. 

[code]

var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; 

------

function angularInit(element, bootstrap) {

  var appElement,

      module,

      config = {};

 

  // The element `element` has priority over any other element

  forEach(ngAttrPrefixes, function(prefix) {

    var name = prefix + 'app';

 

    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {

      appElement = element;

      module = element.getAttribute(name);

    }

  });

  forEach(ngAttrPrefixes, function(prefix) {

    var name = prefix + 'app';

    var candidate;

 

    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {

      appElement = candidate;

      module = candidate.getAttribute(name);

    }

  });

  if (appElement) {

    config.strictDi = getNgAttribute(appElement, "strict-di") !== null;

    bootstrap(appElement, module ? [module] : [], config);

  }

} 

[/code]

5. 위에서 html에 ng-app가 있으면 appElement = 'html'이 되고, body에 있으면 body를 가지고 bootstrap으로 넘어 가네요 

 

Automatic Initialization

concepts-startup.png

Angular initializes automatically upon DOMContentLoaded event or when theangular.js script is evaluated if at that time document.readyState is set to'complete'. At this point Angular looks for the ng-app directive which designates your application root. If the ng-app directive is found then Angular will:

  • load the module associated with the directive.
  • create the application injector
  • compile the DOM treating the ng-app directive as the root of the compilation. This allows you to tell it to treat only a portion of the DOM as an Angular application.
<!doctype html>
<html ng-app="optionalModuleName">
  <body>
    I can add: {{ 1+2 }}.
    <script src="angular.js"></script>
  </body>
</html>

As a best practice, consider adding an ng-strict-di directive on the same element as ng-app:

<!doctype html>
<html ng-app="optionalModuleName" ng-strict-di>
  <body>
    I can add: {{ 1+2 }}.
    <script src="angular.js"></script>
  </body>
</html>

This will ensure that all services in your application are properly annotated. See the dependency injection strict mode docs for more. 

|

댓글 2개

근데 이제 2.0해야 하는것 아닌가요? ㅠㅜ
저 고민되요.
2015-09-17 (목) 07:05:41
http://www.hanbit.co.kr/network/view.html?bi_id=1981 지금 배우신다고 하면 2.0으로 하시는 것도 좋죠.. 앞으로의 대세는 모바일쪽이니 mobile first로 가시는 것도...
댓글을 작성하시려면 로그인이 필요합니다.

앱개발

758건
+
분류 제목 글쓴이 날짜 조회
15-10-01 조회 1,701
15-10-01 조회 1,976
15-10-01 조회 1,490
15-09-26 조회 1,326
15-09-24 조회 2,090
15-09-23 조회 1,182
15-09-23 조회 1,768
15-09-23 조회 1,121
15-09-23 조회 1,305
15-09-23 조회 1,296
15-09-23 조회 1,780
15-09-23 조회 1,910
15-09-23 조회 1,139
15-09-22 조회 1,882
15-09-22 조회 1,787
15-09-21 조회 2,623
15-09-18 조회 1,211
15-09-18 조회 1,658
15-09-12 조회 2,534
15-09-11 조회 1,638
15-09-11 조회 1,169
15-09-10 조회 1,456
15-09-06 조회 1,377
15-09-06 조회 1,766
15-09-06 조회 1,829
15-09-05 조회 2,530
15-09-05 조회 1,335
15-09-04 조회 1,577
15-09-02 조회 1,602
15-09-02 조회 2,037