Angular(二)——指令

       指令是Angular的一个特殊标志,也是有别于其他框架的一个重要特征,Angular之所以功能强大,在很大程度上得益于它拥有大量内置的指令,也能通过语法自定义指令。从字面意义来说,“指令”是一种执行的信号,一旦发布了这个指令,就要执行某项动作。Angular中的指令是一个在特定DOM元素上执行的函数。

Angular

一、定义指令

在Angular中,定义一个新指令的方法很简单,只需要调用directive方法即可,该方法可以接收两个参数,具体的调用格式如下:
var app = angular.module("myapp", []);
app.directive(name, fn) ;
示例代码如下:

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="angular-1.3.0/angular.min.js"></script>
    </head>
    <body>
        <hello></hello>
        <div hello></div>
        <div class="hello"></div>
        <!-- directive:hello -->
        <div></div>
    
       <script type="text/javascript" >
         var myModule = angular.module("MyModule", []);
         myModule.directive("hello", function() {
         return {
          restrict: 'AEMC',
          template: '<div>Hi everyone!</div>',
          replace: true
    }
});
</script>
</body>
</html>

执行结果如下:


执行结果

二、指令对象的基础属性

       replace属性值是布尔类型的,当该属性值为true时,表示将模板中的内容替换为指令为标记;当该属性值为false时,表示不替换指令标记,而是将内容插入到指令标记中,此时,无论指令标记中是否存在内容,都将被清空,该属性的默认值为false。
       templateUrl的属性值是一个URL地址,该地址将指向一个模板页面,该属性常用于处理复杂模板内容,与template属性不能同时使用,只能取其中之一。
示例代码如下:

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
        <title>指令对象的基础属性</title>
        <script type="text/javascript" src="angular-1.2.16/angular.min.js"></script>
        <style type="text/css">
         .frame{
            padding:2px 8px;
            margin: 0px;
            font-size: 12px;
            width:320px;
            background-color: #eee;
         }
        </style>
    </head>

    <body>
     <div class="frame">
        <ts-tplfile></ts-tplfile>
        <ts-tplscipt></ts-tplscipt>
        <ts-tplcache></ts-tplcache>
     </div>
     <script type="text/ng-template" id="tpl">
         <h3>模板内容来自于script元素</h3>
     </script>

     <script type="text/javascript">
     var app=angular.module('MyModule',[])
     .run(function($templateCache){
        $templateCache.put('cache',
            '<h3>模板内容来自缓存</h3>')
     })
     .directive('tsTplfile',function(){
        return{
            restrict:'EAC',
            templateUrl:'tpl.html',
        };
     })
     .directive('tsTplscipt',function(){
        return{
            restrict:'EAC',
            templateUrl:'tpl',
            replace:true
        };
     })
      .directive('tsTplcache',function(){
        return{
            restrict:'EAC',
            templateUrl:'cache',
        };
     });

     </script>
    </body> 
</html>

三、Angular指令对象的重要属性

1.指令对象中的transclude属性

在定义指令对象时,可以不添加transclude属性,如果添加该属性,那么它的属性值是布尔类型的,默认值为false,表示不开启属性,如果设置为true时,则开启了该属性;当开启了属性后,就可以在模板中通过ng-transclude方式替换指令元素中的地内容。
代码示例如下:

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="angular-1.3.0/angular.min.js"></script>
    </head>
    <body>
        <hello>
            <div>这里是指令内部的内容。</div>
        </hello>

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

2.指令对象中的link属性

“link”属性的值是一个函数,在该函数中可以操控DOM元素对象,包括绑定元素的各类事件,定义事件触发时执行的内容,函数定义的代码如下:
link:function(scope,element,attrs){
...
}
其中,scope参数表示指令所在的作用域,它的功能和页面中控制器注入的作用域是相同的,element参数表示指令中的元素,attrs表示指令元素的属性集合。
示例代码如下:

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
        <title>指令对象的link属性</title>
        <script type="text/javascript" src="angular-1.2.16/angular.min.js"></script>
        <style type="text/css">
         .frame{
            padding:2px 8px;
            margin: 0px;
            font-size: 12px;
            width:320px;
            background-color: #eee;
         }
         .tip{
            font-size: 9px;
            color:#666;
            margin:3px 5px;
         }
        </style>
        <script type="text/ng-template" id="tpl">
         <button>单击按钮</button>
        </script>

    </head>

    <body>
     <div class="frame">
        <ts-tplscipt></ts-tplscipt>
        <div class="tip">{{content}}</div>
     </div>
   
     <script type="text/javascript">
     var app=angular.module('MyModule',[])
     .directive('tsTplscipt',function(){
        return{
            restrict:'EAC',
            templateUrl:'tpl',
            replace:true,
            link:function(scope,element,attrs){
                element.bind('click',function(){
                    scope.$apply(function(){
                        scope.content='这是点击后的内容';
                    })
                    attrs.$$element[0].disable=true;
                });
            }
        };
     });
     
     </script>
    </body> 
</html>

3.指令对象的scope属性

(1)scope属性是布尔值

scope属性自定义指令时,默认值就是布尔类型的,初始值为false。在这种情况下,指令中的作用域就是指令元素所在的作用域,两者是相同的。如果scope属性值为true,则表示子作用域(指令中的作用域成为子作用域,把指令元素所在的作用域称为父作用域)是独立创建的,当它的内容发生变化时,并不会修改父作用域中的内容。示例代码如下:

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
        <title>scope属性</title>
        <script type="text/javascript" src="angular-1.2.16/angular.min.js"></script>
        <style type="text/css">
         .frame{
            padding:2px 8px;
            margin: 0px;
            font-size: 12px;
            width:320px;
            background-color: #eee;
         }
         .tip{
            font-size: 9px;
            color:#666;
            margin: 3px 5px;
         }
        </style>
        <script type="text/ng-template" id="tpl">
          <div class="tip">{{message}}</div>
          <button ng-transclude></button>
        </script>
    </head>

    <body>
     <div class="frame">
      <input ng-model="message" placeholder="请输入内容"/>
      <ts-message>固定</ts-message>
     </div>

     <script type="text/javascript">
     var app=angular.module('MyModule',[])
     .directive('tsMessage',function(){
        return{
            restrict:'EAC',
            templateUrl:'tpl',
            transclude:true,
            scope:true,
            link:function(scope,element,attrs){
                element.bind('click',function(){
                    scope.$apply(function(){
                        scope.message='这是单击按钮后的值';
                    })
                })
            }
        };
     });
     </script>
    </body>
    

(2)scope属性是对象

scope属性值还可以设置成一个JSON对象,如果是对象,那么,父作用域与自作用域是完全独立的,不存在任何联系。当指令中的scope属性值是JSON对象时,如果子作用域需要添加属性,必须先添加指令中的link函数,然后,通过函数中的scope对象进行添加;如果在子作用域中,要绑定或调用父作用域中的属性和方法,则需要在scope属性对应的的JSON对象值中添加绑定策略。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容