【AngularJS】—— 11 指令的互相

style=”font-size: 13px; color: #000080;”>前边基本明白了命令的连带内容:

  1
哪些自定义指令

  2
一声令下的复用

style=”font-size: 13px; color: #000080;”>本篇看一下下令之间怎么相互。学习内容出自《慕课网
指令3

  背景介绍

  这例子是视频中的例子,有一个动感超人,有两种能力,力量strength,速度speed,发光light。

  这两种力量作为两种特性,定义动感超人作为一个标签,只要添加对应的性质就能享有该能力。

  为了方便结果的显得,为标签添加鼠标的响应事件,当鼠标移动到相应的价签上就会触发一个办法,打印出所有的能力。

  程序分析

  html部分的代码如下:

        <div>
            <superman>nothing!</superman>
            <superman strength >strength!</superman>
            <superman strength speed >strength speed!</superman>
            <superman strength speed light >strength speed light!</superman>
        </div>

  下面看看如何贯彻,首先仍旧是成立一个模块:

var myAppModule = angular.module("myApp",[]);

  在该模块的基础上,成立标签superman,与前方类似。

myAppModule.directive("superman",function(){
                return{
                    scope:{},
                    restrict:'AE',
                    transclude:true,
                    template:"<div><div ng-transclude></div></div>",
                    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,attr){
                        element.bind("mouseenter",function(){
                            console.log(scope.abilities);
                        });
                    }
                }
            });

  这里不同的是,在情势内部有一个controller属性,这一个并不是ng-controller这种控制器,而是指令对外开放的一个接口,里面注明的方法,在外表可以看成公开的法子运用,其他的指令可以通过倚重,使用这个主意。

  接下去再创立四个力量对应的一声令下

            myAppModule.directive("strength",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addStrength();
                    }
                }
            });
            myAppModule.directive("speed",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addSpeed();
                    }
                }
            });
            myAppModule.directive("light",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addLight();
                    }
                }
            });

  多少个指令的代码都差不多,其中require指定了依靠的指令。

  link中多了一个参数supermanCtrl,这多少个参数揣摸是superman中的controller,所以命名接纳superman+Ctrl的法子。

  【由于不懂内部原理,这里仅仅是推测,但是实验求证,假使改变那个参数的名字,会报错。】

  声明了这四个指令,就足以把这四个指令当做super的属性来利用,当注解该属性时,就会触发内部的link内的办法,调用superman中公开的点子。

  

  总括起来,指令的并行过程:

  1
先是创立一个主旨的命令,在controller属性后,添加对曾祖父开的艺术。

  2
成立其他交互的吩咐,在require属性后,添加对应的一声令下看重关系;在link中调用公开的办法

 

  全体程序代码:

<!doctype html>
<html ng-app="myApp">
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>

        <div>
            <superman>nothing!</superman>
            <superman strength >strength!</superman>
            <superman strength speed >strength speed!</superman>
            <superman strength speed light >strength speed light!</superman>
        </div>
        <script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);

            myAppModule.directive("superman",function(){
                return{
                    scope:{},
                    restrict:'AE',
                    transclude:true,
                    template:"<div><div ng-transclude></div></div>",
                    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,attr){
                        element.bind("mouseenter",function(){
                            console.log(scope.abilities);
                        });
                    }
                }
            });
            myAppModule.directive("strength",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addStrength();
                    }
                }
            });
            myAppModule.directive("speed",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addSpeed();
                    }
                }
            });
            myAppModule.directive("light",function(){
                return{
                    require:'^superman',
                    link:function(scope,element,attr,supermanCtrl){
                        supermanCtrl.addLight();
                    }
                }
            });
        </script>
    </body>
</html>

  运行结果:

图片 1

相关文章