zoukankan      html  css  js  c++  java
  • angular1.5 组件学习 -- 3、组件的生命周期钩子

    Components(生命周期)钩子函数

    angular1.5为每个组件提供了生命周期钩子函数去响应不同的时刻,有以下几个钩子:

      1、$onInit():此时 component 构造函数初始化完毕(包括 bindings 中的数据),我们可以使用它来将浮在控制器各个地方的初始化变量集中起来,统一进行初始化操作。

    this.$onInit = function () {
        this.sayHello = "Hello !";
    }

      2、$onChanges(changesObj):当 bindings 单向数据变化时会触发这个钩子。父组件向子组件单向传输数据:“@”、“<”。注:双向绑定不出发。

    this.$onChanges = function (event) {
        //该 event 对象中有单向传输的变量及值方便获取
        console.log(event);
    }

      3、$doCheck():每次脏检查会触发的钩子。

    this.$doCheck = function () {
        //每次脏检查都会触发
        console.log('check');
    }
    this.$onInit = function () {
        //组件加载完成初始化
        this.num = 0;
        $interval(function () {
            self.num = Math.random();
        }, 1000)
    }

      4、$onDestroy():当 controller 的 scope 销毁时会触发的钩子。比如:你使用了 $postLink 来设置了DOM事件监听函数或者其他非Angular原生的逻辑,在 $onDestroy 中你可以把这些事件监听或者非原生逻辑清理干净。

      5、$postLink():当组件及其子组件的元素已经被编译和链接触发的钩子。一个使用场景:tabs 组件中有未知长度的 tabs 数组,而其内 tab 的个数,通过每个 tab 组件初始化后调用 tabs 组件的 add 方法来 push 进 tabs 数组;此时如果想设置默认第几个 tab 被选中,那么只能等待所有 tab页加载完成,才能进行被选中设置。

    <!DOCTYPE html>
    <html lang="en" ng-app="app">
    <head>
        <meta charset="UTF-8">
        <title>postLink 与 transclude 合用</title>
        <script src="angular.js"></script>
        <style>
            .selected {color:red};
        </style>
    </head>
    
    <body>
        <tabs>
            <tab label="Tab 1">
                Tab 1 contents!
            </tab>
            <tab label="Tab 2">
                Tab 2 contents!
            </tab>
            <tab label="Tab 3">
                Tab 3 contents!
            </tab>
        </tabs>
        <script>
            var tab = {
                bindings: {
                    label: '@'
                },
                require: {
                    tabs: '^^'
                },
                transclude: true,
                template: `
                    <div class="tabs__content" ng-if="$ctrl.tab.selected">
                        <div ng-transclude></div>
                    </div>
                `,
                controller: function () {
                    this.$onInit = function () {
                        this.tab = {
                            label: this.label,
                            selected: false
                        };
                        this.tabs.addTab(this.tab);
                    };
                }
            };
    
            var tabs = {
                transclude: true,
                template: `
                    <div class="tabs">
                        <ul class="tabs__list">
                            <li ng-repeat="tab in $ctrl.tabs">
                                <a href=""
                                    ng-bind="tab.label"
                                    ng-click="$ctrl.selectTab($index);"></a>
                            </li>
                        </ul>
                        <div class="tabs__content" ng-transclude></div>
                    </div>
                `,
                controller: function () {
                    this.$onInit = function () {
                        this.tabs = [];
                    };
                    this.addTab = function addTab(tab) {
                        this.tabs.push(tab);
                    };
                    this.selectTab = function selectTab(index) {
                        for (var i = 0; i < this.tabs.length; i++) {
                            this.tabs[i].selected = false;
                        }
                        this.tabs[index].selected = true;
                    };
                    this.$postLink = function () {
                        this.selectTab(0);
                    }
                }
            };
    
            angular.module('app', [])
                .component('tab', tab)
                .component('tabs', tabs);
        </script>
    </body>
    </html>

    这里涉及到组价的另一个属性:transclude,后面会更新其使用。

  • 相关阅读:
    sql注入式攻击的原理及实例分析 (转载)
    java中静态初始化块、初始化块和构造方法的理解 (转载)
    Java Web应用开发中的一些概念(转载)
    Map.Entry的使用(转载)
    java对象的存储位置(转载)-- 结合上一篇一起学习
    深入Java对象及元素的存储区域(转载)
    Java 面试题问与答:编译时与运行时(转载)看了一遍还不是很懂 先收着
    Liferay应用程序模板如何获取自定义结构的字段值
    FreeMarker 快速入门
    Tomcat9.x配置规范
  • 原文地址:https://www.cnblogs.com/guofan/p/8360143.html
Copyright © 2011-2022 走看看