14. AngularJS中自定义指令处理

  • 关键字:directive

  • 指令的作用域: 默认情况下子控制器和父控制器用的是同一个$scope,也就是说子控制器的$scope是可以覆盖掉父控制器的$scope的赋值

  • 给子控件添加一个scope:true,作用域就不会被覆盖,就会独立出一个作用域.

  • 如果在子控制器中使用的一个属性在父控制器中定义了,在子控制器中没有定义,就算加了scope:true,也会使用父控制器的数据,相当于控制器的嵌套,自己没有,就去找父亲

  • 如果给scope设置一个{},就相当于固定作用域,只拿自己的,自己没有就不显示

  • 如果给scope设置一个可以传递参数的配置,{content:’@’},可以像接受参数一样,使用父控制器的属性

  • scope:{myTitle:’@’},属于单向传递

  • scope:{myTitle:’@’},属于单向传递,且如果在子控制器中定义的属性中也有一个myTitle,会被父控制器中的myTitle覆盖

  • scope的修饰符除了是scope:{myTitle:’@’}这种形式,还可以是scope:{myTitle:’=’},
    ”@” 和 ”=” 区别在于是 ”@” 取值的时候使用”{{}}”插入语法
    比如 <xmg content="{{content}}" my-title="{{title}}"></xmg>,
    ”=”, 可是直接<xmg content="content" my-title="title"></xmg>


<body ng-app = "app" ng-controller = "wmxController">

<!--以元素形式出现-->
<wmx-dir>
    <!--下面的内容会有ng-transclude的地方显示-->
    <p>我是预留内容</p>
    <hr>
    {{msg}}
    <hr>
    {{name}}
    <hr>
    {{age}}
</wmx-dir>

<hr>

<!--以属性形式出现-->
<div wmx-dir>
    <p>我也是预留内容哦</p>
    {{msg}}
    {{name}}
</div>

<hr>

<!--scope的修饰符除了是scope:{myTitle:’@’}这种形式时,需要{{}}-->
<!--<wmx-dir content="{{content}}" my-title="{{title}}"></wmx-dir>-->

<!--scope的修饰符除了是scope:{myTitle:’=’}这种形式时,直接使用,不需要{{}}-->
<wmx-dir content="{{content}}" my-title="title"></wmx-dir>

<hr>

<!--如果此处改变,下面的也会改变-->
<input type="text" ng-model="title">

<script src="angular.js"></script>

<script>
    var app = angular.module('app',[]);

    app.controller('wmxController',['$scope',function ($scope) {
        $scope.name = '我是父控制器中的名字';
        $scope.age = 110;
        $scope.content = "我是父控制器中的内容";
        $scope.title = "我是父控制器中的title";
    }]);

    /**
     * 自定义指令:
     * 参数一:指令的名称,如果属性中有大写字母,要用-隔开
     * 参数二:自定义指令的回调方法,写逻辑的地方
     *自定义指令的方法名directive 固定不变
     * 注意指令是写在控制器之外的
     * 默认情况下,指令使用的模型是与它所在控制器使用的是同一个
     */
    app.directive('wmxDir',function () {
        /**
         * 返回一个对象,通过{}括起来的键值对称为对象
         */
        return {
            /**
             * E:以元素形式出现
             * A:以属性形式出现
             * C:以类的形式出现
             */
            restrict:'EA',

            //指令模板必须有且只有一个根元素包裹起来
              //如果此处改变,上面的不会跟着改变。因为是单向传递
//            template:'<h1>{{msg}} <p>{{content}}</p> <p>{{myTitle}}</p> <input type="text" ng-model="myTitle"> </h1>',

             // 如果此处改变,上面的也会跟着改变。因为属于双向传递
             template:'<h1>{{msg}} <p>{{content}}</p> <input type="text" ng-model="myTitle"> </h1>',

            //templateUrl指令用来替换原有的template
            // 比template自定义指令的模板更强大
            // templateUrl 可以指定一个html模板
//            templateUrl:'template.html',

            //是否替换原有的标签 false表示不替换
            replace:true,

            //ng-transclude指令用来处理自定义指令中的预留类内容显示的位置
            transclude:true,

            //自定义指令里面的控制器(子控制器)
               //自定义的指令,可以有自己的作用域,有自己的模型(也有个$scope)
               //父控制器中$scope的默认情况下会被覆盖
            controller:function ($scope) {
                $scope.name = "我是子控制器中的名字";
                $scope.msg = "我是自定义指令中的信息";

                // scope:{myTitle:’@’},属于单向传递
                // 且如果在子控制器中定义的属性中也有一个myTitle,会被父控制器中的myTitle覆盖.
                $scope.myTitle = '我是子控制器的title'
            },
            //给子控件添加一个scope:true,作用域就不会被覆盖,
            // 就会独立出一个作用域.
//            scope:true,

            // 如果给scope设置一个{},就相当于固定作用域,
            // 只拿自己的,自己没有就不显示
//            scope:{}

            //如果给scope设置一个可以传递参数的配置,{content:’@’},
            // 可以像接受参数一样,使用父控制器的属性
            scope:{
                //外界传递进来的数据
                content:'@',

                //scope:{myTitle:’@’},属于单向传递
                //@是单向传递,外界修改,内部会跟着修改
                //内部修改,外界不会跟着修改
//                myTitle:'@'

                //scope的修饰符除了是scope:{myTitle:’@’}这种形式,
                // 还可以是scope:{myTitle:’=’},
                // ”@”和”=”区别在于是”@”取值的时候使用”{{}}”插入语法
                // 比如 <xmg content="{{content}}" my-title="{{title}}"></xmg>,
                // 而”=”,可是直接<xmg content="content" my-title="title"></xmg>
                myTitle:'='
            }

        }
    });
</script>
</body>
  • scope:{childmentod:’&’},属方法传递,父控制器传递方法给子控制器.
<body ng-app = "app" ng-controller = "wmxController">

<wmx child-method = "parentMethod()">
   <p>我是预留内容</p>
</wmx>

<hr>
<p wmx child-method = "parentMethod()"></p>

<script src="angular.js"></script>

<script>
   var app = angular.module('app',[]);
   app.controller('wmxController',['$scope',function ($scope) {
       $scope.parentMethod = function () {
           alert('我是父控制器中的方法')
       }
   }]);
   app.directive('wmx',function () {
       return {
           restrict:'EA',
           template:'<div><button ng-click="click()">点我触发自控制器中的方法</button></div>',
           controller:function ($scope) {
               $scope.click = function () {
                   $scope.childMethod();
               }
           },
           replace:true,

           //scope:{childmentod:’&’},属方法传递
           // 父控制器传递方法给子控制器.
           scope:{
               //方法的传递
               childMethod:'&'
           }

       }
   });
</script>
</body>
  • link指令
    • controller 中的方法在编译指令前执行,一般都是处理一些业务逻辑,dom还没有加载渲染完毕就已经执行

    • 在controller里面只能处理一些数据逻辑,而不能操作DOM节点

    • link操作dom元素,所有controller在link之前被调用

    • 所有内容编译之后会调用。
      * 此方法执行时,所有的DOM元素都已经加载完毕


<body ng-app = "app" ng-controller = "wmxController">

<h2 ng-show="true">我是标题2</h2>

    <hr>

<!--功能与ng-show相同-->
<p wmx-show="true"></p>

<script src="angular.js"></script>

<script>
    var app = angular.module('app',[]);

    app.controller('wmxController',['$scope',function ($scope) {
        $scope.name = '我是controller';
        alert($scope.name);
    }]);

    app.directive('wmxShow',function () {
        return {
            restrict:'A',
            template:"<div>我是指令</div>",
            controller:function ($scope) {
                //controller 中的方法在编译指令前执行,一般都是处理一些业务逻辑
                //dom还没有加载渲染完毕就已经执行
                //在controller里面只能处理一些数据逻辑,而不能操作DOM节点
            },

            /**
             * link操作dom元素,所有controller在link之前被调用
             * 所有内容编译之后会调用。
             * 此方法执行时,所有的DOM元素都已经加载完毕
             * @param $scope 控制器中的模型
             * @param ele 指令所在dom元素,注意它是一个JQLite对象
             * @param attr 指令身上绑定的所有属性
             */
            link:function ($scope,ele,attr) {
                //试着打印参数代表什么
                console.log(ele);
                console.log(attr);

                //先弹出控制器的,再弹出link的
                alert("我是link");

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

推荐阅读更多精彩内容