19angular1中的directive

妖精的绣舞 提交于 2020-02-02 05:08:28
注意:1、在分页组件中,从后台获取总项数,触发改造函数,获取改造后的总项数,分页组件重载。组件不重载的情况:没有触发改造函数;解决办法是:$scope.$watch('总项数', function (nl) {执行改造函数})。2、分页组件的展示逻辑:(1)以当前页为中心,根据当前页的大小,展示左侧;(2)以最大值与当前页的差值为中心,根据差值的大小,展示右侧。

 

一、自定义标签1、在JS里,使用驼峰命名法来命名,如:myDirective;在html页面调用该指令时需要以 - 分割,如: my-directive。2、在自定义组件中,template,构成DOM,(1)compile,生成DOM、监听DOM、修改呈现内容,(2)controller:用来提供可在指令间复用的行为,(3)link,在compile后操作DOM,需要用scope.$apply(scope.doSomething())调用scope.doSomething()。
if (that.alertHtml && that.alertMethod) {
    that.alertScope = $rootScope.$new();
    angular.extend(that.alertScope, that.alertMethod);
    angular.element(document.getElementById('#myAlert')).empty().append($compile(angular.element(that.alertHtml))(that.alertScope));
    //$compile(DOM元素)(作用域)
}
示例一:
<!DOCTYPE html>
<html lang="en" ng-app="appModule" >
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="https://cdn.bootcss.com/angular.js/1.5.8/angular.js"></script>
</head>
<body >
<div ng-controller="parent">
    {{ message }}
    <div otc-dynamic></div>
</div>
</body>
</html>
<script>
    var app = angular.module('appModule',[]);
    app.controller("parent",function($scope){
        $scope.label = "Please click";
        $scope.message = "点击-前";
        $scope.doSomething = function(){
            $scope.message = "点击-后";
        };
    });
    /*app.directive("otcDynamic",function(){
          return{
               template:"<button ng-click='doSomething()'>{{label}}</div>"
          };
      });*/
    app.directive("otcDynamic", function(){
        return {
            link: function(scope, element){
                element.html("<button ng-click='doSomething()'>点击</button>");//这是数据绑定,能绑定事件的compile早已经执行完毕
                element.on("click",function () {
                    scope.$apply(scope.doSomething());//此处换成scope.doSomething(),点击后不会执行
                });
            }
        };
    });
</script>
二、自定义标签嵌套示例二:
<!DOCTYPE html>
<html lang="en" ng-app="appModule" ng-controller="ancestorCtrl">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<my-parent>
    {{ancestorName}}
    <my-child selfAttr="myAttr">{{childName}}</my-child>
</my-parent>
<script type="text/javascript" src="https://cdn.bootcss.com/angular.js/1.5.8/angular.js"></script>
<script>
    var app = angular.module('appModule', []);
    app.controller("ancestorCtrl", function ($scope) {
        $scope.ancestorName = "我所处的位置,表明我只能在ng-transclude里出现。";
        $scope.childName = "变量必须定义在作用域里,myParent和myChild的作用域我进不去。";
    });
    app.directive('myParent', function () {
        return {
            template: "<div><p>第一段</p>" + "<div ng-transclude></div>" + "<p>第二段</p>" + "<div>{{parentName}}</div></div>",
            //template: '<div>我是指令生<div ng-transclude></div>成的内容</div>',//templateUrl导入自定义元素的模板
            restrict: 'E',//指令类型  E:element A:attribute M:comment C: class
            replace: true,//模板放在<my-parent>内部还是取代它,默认是false,放在其内部
            transclude: true,//是否保留自定义指令开闭标签之间的内容,该内容插入模板中使用ng-transclude属性的地方,默认为false,如上。<div ng-view></div>通过路由放入数据
            scope: {
                //获取自定义标签的属性值//false:继承父作用域;true:继承父作用域且创建独立作用域;{}:不继承父作用域且创建独立作用域。
                //scope:{name:'@name',绑定字符串  name:'=name',绑定变量  name:'&name',绑定函数}。传进来的变量,在值改变后,父作用域的该变量的值也随之改变。
            },
            controller: function ($scope) {/*左边的controller是上面template的控制器*/
                //指令的controller和link可以进行互换。controller可进可出,主要特征或作用(1)导入ng内置或自定义服务;(2)提供可在指令间复用的行为。
                $scope.focusAAA = function () {
                };
                $scope.parentName = "定义在myParent里的变量。";
                this.parentMethod = function () {
                    console.log('这个方法是给子作用域调用的。');
                }
            },
            /* compile: function(element, attributes) {
             //compile和link是相斥的。如果同时设置了两项,compile返回的函数会被当作链接函数把后面定义的link函数所取代,也就是说,后面的link函数将起不到作用。controller先运行,compile后运行,link不运行
             },*/
            link: function (scope, element, attr, ctrl, linker) {
                //指令的controller和link可以进行互换。link不进不出,主要特征或作用(1)不能导入ng内置或自定义服务;(2)不能提供可在指令间复用的行为。
                //scope:指令所在的作用域
                //element:指令元素的封装,可以调用angular封装的简装jq方法和属性,如element.css()
                //attr:指令元素的属性的集合,如attr.selfAttr
                //ctrl:用于调用其他指令的方法,指令之间的互相通信使用,需要require配合,如下面myChild内部、link中的ctrl.parentMethod()。
                //linker:用于操作transclude里面嵌入的内容;linker函数有2个参数,第1个参数scope,第2个参数是函数,函数接受参数clone,clone就是transclude里面被嵌套的内容。
            }
        }
    });
    app.directive('myChild', function () {
        return {
            template: "<div><span>这里是span1;</span><span>这里是span2。</span><div ng-transclude></div></div>",
            restrict: 'E',
            replace: true,
            transclude: true,
            scope: {},
            require: '?^myParent',//?不要抛出异常;^允许查找父元素的controller
            controller: function ($scope) {
             
            },
            /*compile: function(element, attributes) {},*/
            //'myParent':在当前指令中查找控制器;'^myParent'在上游指令中查找控制器;'?^myParent':当前指令若没有,就向上游查找
            link: function (scope, element, attr, ctrl, linker) {
                ctrl.parentMethod();
                linker(scope, function (clone) {
                    console.log(clone.text())
                })
            }
        }
    })
</script>
</body>
</html>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!