美文网首页
14. AngularJS中自定义指令处理

14. AngularJS中自定义指令处理

作者: 小草莓蹦蹦跳 | 来源:发表于2017-10-15 21:39 被阅读0次
  • 关键字: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>

相关文章

网友评论

      本文标题:14. AngularJS中自定义指令处理

      本文链接:https://www.haomeiwen.com/subject/qhkcuxtx.html