AngularJS自定义指令

一.restrict属性:

 

二.replace属性
    默认为false,若设置为true,则会移除用户在html中的内容。 

<hello>  
    <div>这里是指令内部的内容。</div>  
</hello>  

  

var myModule = angular.module("MyModule", []);  
myModule.directive("hello", function() {  
    return {  
        restrict:"AE",  
        template:"<div>Hello everyone!</div>",  
        replace:true  
    }   
});  

  编译为:

三.$templateCache对象:从浏览器缓存中获得html片段

  示例:<hello></hello>

var myModule = angular.module("MyModule", []);  
  
//注射器加载完所有模块时,此方法执行一次  
myModule.run(function($templateCache){  
    $templateCache.put("hello.html","<div>Hello everyone!!!!!!</div>");  
});  
  
myModule.directive("hello", function($templateCache) {  
    return {  
        restrict: 'AECM',  
        template: $templateCache.get("hello.html"),  
        replace: true  
    }  
}); 

  编译结果:

四.templateUrl属性

var myModule = angular.module("MyModule", []);  
myModule.directive("hello", function() {  
    return {  
        restrict: 'AECM',  
        templateUrl: 'hello.html',  
        replace: true  
    }  
});  

  最后编译的结果为:用户定义的html片段内容。

五.transclude属性

   若设置为true,则保留用户在html中定义的内容。

   示例:

<hello>  
    <div>这里是指令内部的内容。</div>  
</hello> 

  

var myModule = angular.module("MyModule", []);  
myModule.directive("hello", function() {  
    return {  
        restrict:"AE",  
        transclude:true,  
        template:"<div>Hello everyone!<div ng-transclude></div></div>"  
    }   
});  

  

六.directive(指令)与controller(控制器)之间的交互

   示例:

<!doctype html>  
<html ng-app="MyModule">  
    <head>  
        <meta charset="utf-8">  
    </head>  
    <body>  
        <div ng-controller="MyCtrl">  
            <loader howToLoad="loadData()">滑动加载</loader>  
        </div>  
        <div ng-controller="MyCtrl2">  
            <loader howToLoad="loadData2()">滑动加载</loader>  
        </div>  
    </body>  
    <script src="framework/angular-1.3.0.14/angular.js"></script>  
    <script src="Directive&Controller.js"></script>  
</html>  

  

var myModule = angular.module("MyModule", []);  
myModule.controller('MyCtrl', ['$scope', function($scope){  
    $scope.loadData=function(){  
        console.log("加载数据中...");  
    }  
}]);  
myModule.controller('MyCtrl2', ['$scope', function($scope){  
    $scope.loadData2=function(){  
        console.log("加载数据中...22222");  
    }  
}]);  
myModule.directive("loader", function() {  
    return {  
        restrict:"AE",  
        link:function(scope,element,attrs){  
            element.bind('mouseenter', function(event) {  
                //scope.loadData();  
                // scope.$apply("loadData()");  
                // 注意这里的坑,howToLoad会被转换成小写的howtoload  
                scope.$apply(attrs.howtoload);  
            });  
        }  
    }   
}); 

  

七.directive(指令)之间的交互

   示例:

<!doctype html>  
<html ng-app="MyModule">  
  
<head>  
    <meta charset="utf-8">  
    <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">  
    <script src="framework/angular-1.3.0.14/angular.js"></script>  
    <script src="Directive&Directive.js"></script>  
</head>  
  
<body>  
    <div class="row">  
        <div class="col-md-3">  
            <superman strength>动感超人---力量</superman>  
        </div>  
    </div>  
    <div class="row">  
        <div class="col-md-3">  
            <superman strength speed>动感超人2---力量+敏捷</superman>  
        </div>  
    </div>  
    <div class="row">  
        <div class="col-md-3">  
            <superman strength speed light>动感超人3---力量+敏捷+发光</superman>  
        </div>  
    </div>  
</body>  
</html> 

  

var myModule = angular.module("MyModule", []);  
myModule.directive("superman", function() {  
    return {  
        scope: {},   //独立作用域  
        restrict: 'AE',  
        controller: function($scope) {  //暴露共用的属性和方法  
            $scope.abilities = [];  
            this.addStrength = function() {  
                $scope.abilities.push("strength");  
            };  
            this.addSpeed = function() {  
                $scope.abilities.push("speed");  
            };  
            this.addLight = function() {  
                $scope.abilities.push("light");  
            };  
        },  
        link: function(scope, element, attrs) {  //操作DOM  
            element.addClass('btn btn-primary');  
            element.bind("mouseenter", function() {  
                console.log(scope.abilities);  
            });  
        }  
    }  
});  
myModule.directive("strength", function() {  
    return {  
        require: '^superman',  
        link: function(scope, element, attrs, supermanCtrl) {  
            supermanCtrl.addStrength();  
        }  
    }  
});  
myModule.directive("speed", function() {  
    return {  
        require: '^superman',  
        link: function(scope, element, attrs, supermanCtrl) {  
            supermanCtrl.addSpeed();  
        }  
    }  
});  
myModule.directive("light", function() {  
    return {  
        require: '^superman',  
        link: function(scope, element, attrs, supermanCtrl) {  
            supermanCtrl.addLight();  
        }  
    }  
});

  

原文地址:https://www.cnblogs.com/wupeng88/p/5804127.html