AngularJS 指令的交互详解及实例代码


Posted in Javascript onSeptember 14, 2016

背景介绍

这例子是视频中的例子,有一个动感超人,有三种能力,力量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>

 

 运行结果:

AngularJS 指令的交互详解及实例代码

        以上就是对AngularJS 指令的交互的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript Konami Code 实现代码
Jul 29 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
JS与C#编码解码
Dec 03 Javascript
js控制input输入字符解析
Dec 27 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
Feb 28 Javascript
JavaScript常用脚本汇总(二)
Mar 04 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
非常优秀的JS图片轮播插件Swiper的用法
Jan 03 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
详解Typescript 内置的模块导入兼容方式
May 31 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
Sep 14 #Javascript
什么是JavaScript注入攻击?
Sep 14 #Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
Sep 14 #Javascript
再谈javascript注入 黑客必备!
Sep 14 #Javascript
AngularJS 表达式详解及实例代码
Sep 14 #Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 #Javascript
js注入 黑客之路必备!
Sep 14 #Javascript
You might like
php的curl实现get和post的代码
2008/08/23 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
在Python下尝试多线程编程
2015/04/28 Python
Python实现高效求解素数代码实例
2015/06/30 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
python实时监控cpu小工具
2018/06/21 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
公证委托书大全
2014/04/04 职场文书
财产公证书
2014/04/10 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python