美文网首页
[记录] angular里面directive的详细api

[记录] angular里面directive的详细api

作者: Top_Chenxi | 来源:发表于2017-04-22 14:58 被阅读48次

    angular里面directive的api,工作上常用,记录下来,方便用的时候查询

    
        var ngMyDir = angular.module('myApp', []);
    
    
        ngMyDir.directive('myDirective', function() {
            return {
                /*
                    restrict: 指明指令在DOM里面以什么形式被声明
                    E(元素) :<myDirective></myDirective>
                    A(属性) :<div myDirective='expression'></div>
                    C(类)   :<div class='myDirective'></div>
                    M(注释) :<--directive:myDirective expression-->
                */
                restrict: 'A',
                /*
                    指令的优先级,若在单个DOM上有多个指令,则优先级高的先执行
                */
                priority: 500,
                /*            
                    true或false,若设置为true,则优先级低于此指令的其他指令则无效,不会被调用(优先级相同的还是会执行)
                 */
                // terminal: true,
                /*
                    插入模版
                    1: HTML文本
                    2: 函数,可接受两个参数tElement和tAttrs
                */
                // template: '<a href="http://google.com">Click me to go to Google < /a>'
                template: function(element, attr) {
                    // console.log(element);
                    // console.log($(element).text());
                    return '<p style="background-color:{{color}}">Hello World</p>';
                },
                /*
                    templateUrl:异步加载模版
                    <script type='text/ng-template' id='woshimuban.html'>
                        <div>我是模板内容</div>
                    </script>
                */
                // templateUrl: 'template.html',
                /*
                    渲染出来的HTML有没有带定义的标签 false时带出自定义标签
                */
                replace: true,
                /*
                    为标识符创建一个新的作用域吗,而不是继承父父的作用域
                    false:(继承不隔离) 父作用域和子作用域 scope共用(默认)
                    true:(继承不隔离) 父作用域和子作用域 scope共用 ,但是子作用域的值改变,父作用域不变
                    {}:(不继承隔离)没有继承父作用域的值,所以子作用域,改变任何一方的值均不能影响另一方的值,
                        但是可以用过  <div my-directive color-attr="{{testVm.name}}"></div> 
                        如果绑定的隔离作用域属性名与元素的属性名相同,则可以采取缺省写法 '@'
                        还可以 使用=(=attr)进行双向绑定 <div my-directive color="testVm.name"></div>
                        传递函数用& <div my-directive saysomething999="say();"></div> 
                */
                scope: {
                    color: '@colorAttr',
                    // color: '=',
                    // saysomething:'&saysomething999',
                },
                // 定义 控制器 可以 controller: 'SomeController'  也可以匿名,如下
                controller: function($scope, $element, $attrs, $transclude, $log) {
                    // $scope,与指令元素相关联的作用域
                    // $element,当前指令对应的 元素
                    // $attrs,由当前元素的属性组成的对象
                    // $transclude,嵌入链接函数,实际被执行用来克隆元素和操作DOM的函数
                    // console.log($scope.color);
                    // $scope.color = '#666';
                    // console.log($scope.color); // 改变了没用。。
                },
                // 通过标识符拷贝编程修改dom模版  compile 和 link 只能选一种
                // controller先运行,compile后运行,link不运行(link就是compile中的postLink)
                // controller先运行,link后运行,link和compile不兼容
                compile: function(element, attributes) {
                    console.log(element.text());
                    console.log(element);
                    console.log(attributes);
                    return {
                        pre: function preLink(scope, iElement, iAttrs, controller) {
                            console.log(1, scope, iElement, iAttrs, controller);
                        },
                        post: function postLink(scope, iElement, iAttrs, controller) {
                            console.log(2, scope, iElement, iAttrs, controller);
                        }
                    }
                },
                link: function($scope, $element, $Attributes, $ctrls) {
                    console.log($scope.color);
                    console.log($element.text());
                    console.log($Attributes.colorAttr);
                    console.log($ctrls);
                },
                // 第二种方式
                link: {
                    // 使用pre-link函数可以运行一些业务代码在ng执行完compile函数之后,
                    // 但是在它所有子指令的post-link函数将要执行之前.
                    pre: function($scope, $element, $Attributes, $ctrls) {
                        console.log(1);
                    },
                    // 使用post-link函数来执行业务逻辑,在这个阶段,它已经知道它所有的子指令已经编译完成
                    // 并且pre-link以及post-link函数已经执行完成
                    post: function($scope, $element, $Attributes, $ctrls) {
                        console.log(2);
                    }
                }
            };
        });
    

    相关文章

      网友评论

          本文标题:[记录] angular里面directive的详细api

          本文链接:https://www.haomeiwen.com/subject/bseszttx.html