程序员

自定义指令(下)

2018-07-11  本文已影响0人  全村的希望iOS

简介

        在我们用Angular开发中,我们必须要知道angular的生命中器,这个在未来的开发中至关重要。

        AngularJs生命周期分为两个阶段。

        编译阶段: 在编译阶段,AngularJs会遍历整个HTML文档并处理页面上声明的指令,这些指令可能是嵌套。在完成遍历或编译后,会返回一个模版函数,我们可以在模版函数返回之前对编译后的DOM进行修改,在这个时候对DOM进行修改,可以大幅度减少性能花销,因为DOM还未进行数据绑定编译完成,我们可以通过编译函数对DOM进行访问(此时的DOM并未呗渲染到页面中)。

        链接阶段:编译完成即进入链接阶段,在链接阶段,数据与DOM进行绑定。

注意:上面两句话非常重要,与学习Vue必须学习Vue的生命周期一样重要       

link函数

        link阶段负责将作用域和DOM进行链接,我们可以指定link函数,对已经编译的DOM进行一些如事件监听等操作。

        link函数可接受三个或四个参数

        scope该指令的作用域

        ele指令元素

        attrs指令上的属性

        当指令的require属性被指定 则第四个参数生效,否则为underfined

例子

       <body ng-app="myApp">

            <my-directive diy="Angular"></my-directive>

       </body>

        <script>

            var app = angular.module("myApp",[]);

            app.directive("myDirective",function(){

                    return {

                        template: `

                                <div>

                                        <h1>自定义指令{{name}}</h1>

                                </div>

                        `,

                           link: function(scope,ele,attrs) {

                                console.log(ele,arrts);//ele是DOM元素,attrs是DOm元素上的属性

                                scope.name="Angular";

                                //angular自带轻量级的jQuery

                                ele.children().css("background","red");

                           }

                    }

            })

        </script>

require配置项

    require参数被用来指定该指令依赖的其他指令

    在父子指令或兄弟指令的controller之间的一个桥梁,而require也用恰恰可以用来做指令间的通信

    <body ng-app="myApp">

            <first-directive>

                    <second-directive third-directive></second-directive>

            </first-directive>

     </body>

      <script>

            var app = angular.module("myApp",[]);

            app.directive("firstDirective",function(){

                return {

                    controller: ["$scope",functiom($scope){

                            $scope.firstName= "first";

                            this.info = {

                                    name: $scope.firstName,

                                    age: 25

                             }

                    }]

                }

            }),

            app.directive("secondDirective",function() {

                    return {

                            template: `

                                    <div>

                                                <h1>第二个指令</h1>

                                    </div>

                            `,

                            require: "?^thirdDirective"

                            link: function(scope,ele,attrs,ctrl) {

                                    console.log(ctrl.name)

                            }

                    }

            })

            app.directive("thirdDirective",function(){

                    return {

                            restrict: "A",

                             require: "?^firstDirective",//?本级^上级 本级或上级查找

                            link: function(scope,ele,attrs,ctrl){

                                        console.log(ctrl.info)

                            },

                            controller: ["$scope",function($scope){

                                    this.name = "thirdDirective";

                            }]

                    }

            })

       </script>


                                                    不积跬步无以至千里,不积小流无以成江海    

上一篇下一篇

猜你喜欢

热点阅读