AngularJS中除了内置指令,还可以自定义指令。自定义指令和自定义过滤器一样,有两种方法:

第一种,在module中配置:$compileProvider.directive('directiveName', function(){ });

       代码模版为:

    $compileProvider.directive('', ['', function(){
    // Runs during compile
    return {
        // name: '',
        // priority: 1,
        // terminal: true,
        // scope: {}, // {} = isolate, true = child, false/undefined = no change
        // controller: function($scope, $element, $attrs, $transclude) {},
        // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements
        // restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
        // template: '',
        // templateUrl: '',
        // replace: true,
        // transclude: true,
        // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})),
        link: function($scope, iElm, iAttrs, controller) {
            
        }
    };

       第二种,.directive('directiveName', function(){ });

       代码模版为:

        .directive('', ['', function(){
            // Runs during compile
            return {
                // name: '',
                // priority: 1,
                // terminal: true,
                // scope: {}, // {} = isolate, true = child, false/undefined = no change
                // controller: function($scope, $element, $attrs, $transclude) {},
                // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements
                // restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
                // template: '',
                // templateUrl: '',
                // replace: true,
                // transclude: true,
                // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})),
                link: function($scope, iElm, iAttrs, controller) {
                    
                }
            };
        }]);

  可以看到,定义指令会返回一个对象,这个对象里面包含了各个属性(选项),这些属性(选项)就是用来定义指令的。


     指令的名字不要和内置指令冲突,如果指令的名字为xxx-yyy,那么设置指令的名字时应为xxxYyy,即驼峰式的命名。


restrict: 描述指令在模版中的使用方式,包括:元素、样式类、属性、注释,或者以上几种方式的任意组合。

AngularJS中自定义指令_第1张图片


template: 以字符串的形式编写一个内联模板。


templateUrl: 加载模版所需要使用的url,如果已经指定了template,此属性会被忽略。


replace: 如果该属性为true,则替换指令所在的元素;如果为false或者不指定,则追加到元素内部。


例子:





    



    
    
                   angular.module('firstMoudule', [], function($compileProvider, $controllerProvider) {         $compileProvider.directive('firstTag', function() {             return {                 restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment                 template: '
hello pomelo!
',                 replace: true             };         });         $controllerProvider.register('firstController', function() {});     });     


transclude: 当此属性为true时,把指令元素中原来的子节点移动到一个新模板的内部。

例子:





    



    
        old data