Angular 运行机制

2018-11-09  本文已影响0人  direwolf_

Angular 模块

模块是用来组合相关组件、指令、服务等的一个功能块。可以理解为就是对一个应用所要用到的各个部分按照一定的规律进行归类,从而组成一个完整的应用。
Angular 模块可以通过 angular.module(name, requires) 方法生成:

angular.module(name) 相当于 AngularJS 模块的 getter 方法,用了获取对模块的引用。

使用模块的好处:
Angular 模块包含什么?
结构化 Angular 模块

建议把应用程序分解成多个模块:

这样分解的原因是,在测试中经常需要忽略初始化代码,这往往很难测试。通过把它放到一个单独的模块中在测试中很容易被忽略。通过只加载模块,测试也可以更加集中。

Module 的加载和依赖

加载

Module 的加载分为两个阶段:configrun

AngularJS 会以这些函数的书写和注册顺序来执行它们,也就是说我们无法注入一个尚未注册的 provider(唯一例外的是 constant() 方法,这个方法总会在所有配置块之前被执行)。

angular.module('myApp', [])
.config(function ($provide) {

})

.config() 函数接收一个参数:configFunction, AngularJS在模块加载时会执行这个函数。

angular.module('myApp', [])
.run(function ($rootScope, AuthService) {
  $rootScope.$on('$routeChangeStart', function (evt, next, current) {
    // 如果用户未登录
    if (!AuthService.userLoggedIn()) {
      if (next.templateUrl === 'login.html') {
        // 已经转向登录路由因此无需重定向
      } else {
        $loction.path('./login');
      }
    }
  });
});

.run() 函数接收一个参数:initializeFn, AngularJS在注入器创建后会执行这个函数。

依赖

一个模块可以列出它所要依赖的模块的列表,这些被依赖的模块需要在该模块加载前加载,也就是说,被依赖的模块的配置块要在该模块的配置块之前执行。每个模块只能加载一次,即使多个模块依赖它。

执行顺序

order.html

<div ng-controller="Ctrl">
    {{title}}
    <p>{{type | filter}}</p>
    <directive>{{text}}</directive>
    <p>{{type | filter}}</p>
</div>

order.js

(function () {
    angular.module('order', [])
        .controller('Ctrl', ['$scope', 'factory', 'service', function ($scope, factory, service) {
            $scope.title = '顺序检测';
            $scope.text = 'text';
            $scope.con = function () {
                console.log('click')
            };
            console.log('controller-------8');
            factory();
            service.service();
        }])
        .factory('factory', function () {
            console.log('factory-------6');
            return function () {
                console.log('factory-fn-------9');
            }
        })
        .service('service', function () {
            console.log('service-------7');
            this.service = function () {
                console.log('service-fn-------10');
            }
        }).filter('filter', function () {
            console.log('filter-------3');
            return function () {
                console.log('filter-fn-------13');
            }
        }).config(function () {
            console.log('config-------1');
        }).run(function () {
            console.log('run-------2');
        }).directive('directive', function () {
            console.log('directive-------4')
            return {
                restrict: 'E',
                compile: function () {
                    console.log('directive-compile-------5');
                    return {
                        pre: function preLink () {
                            console.log('compile-preLink-------11')
                        },
                        post: function postLink() {
                            console.log('compile-postLink-------12')
                        }
                    }
                },
                link: function () {
                    console.log('directive-link');//有compile时不执行
                }
            }
        })
})();

参考文章:
https://github.com/angular/angular.js/blob/ce669edfa14dc7eb7c389d2f82c9c98399a9009b/docs/content/guide/module.ngdoc

上一篇下一篇

猜你喜欢

热点阅读