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 相关文章推荐
js getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
js hover 定时器(实例代码)
Nov 12 Javascript
js中的事件捕捉模型与冒泡模型实例分析
Jan 10 Javascript
jquery自定义右键菜单、全选、不连续选择
Mar 01 Javascript
AngularJS基础 ng-repeat 指令简单示例
Aug 03 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
Dec 23 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
Mar 02 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
vue input实现点击按钮文字增删功能示例
Jan 29 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
JavaScript 闭包的使用场景
Sep 17 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
我的论坛源代码(二)
2006/10/09 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
JavaScript DOM基础
2015/04/13 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JavaScript 异步调用
2017/10/25 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python 实现二维列表转置
2019/12/02 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python 必须了解的5种高级特征
2020/09/10 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
个人能力自我鉴赏
2014/01/25 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
教师考核材料
2014/05/21 职场文书
应届毕业生自荐信
2014/05/28 职场文书
通知怎么写?
2019/04/17 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
Java 多线程协作作业之信号同步
2022/05/11 Java/Android