详解angularjs中如何实现控制器和指令之间交互


Posted in Javascript onMay 31, 2017

如果我们具有下面的DOM结构:

<div ng-controller="MyCtrl"> 
   <loader>滑动加载</loader> 
</div>

同时我们的控制器具有如下的签名:

var myModule = angular.module("MyModule", []); 
//首先定义一个模块并在模块下挂载控制器,第二个参数为一个数组,其中函数前面的参数都是会被注入到函数形参上面的 
myModule.controller('MyCtrl', ['$scope', function($scope){ 
  $scope.loadData=function(){ 
    console.log("加载数据中..."); 
  } 
}]);

同时指令的签名如下:

myModule.directive("loader", function() { 
  return { 
    restrict:"AE",//Element,Attribute 
    link:function(scope,element,attrs){ 
      element.bind('mouseenter', function(event) { 
        //scope.loadData(); 
        // scope.$apply("loadData()"); 
        // 注意这里的坑,howToLoad会被转换成小写的howtoload 
      }); 
    } 
  }  
});

这时候我们的指令通过scope.loadData或者scope.$apply就可以完成对控制器的调用了。但是如果我们具有两个控制器呢?而且两个控制器中$scope中方法是不同的?

var myModule = angular.module("MyModule", []); 
//首先定义一个模块并在模块下挂载控制器,第二个参数为一个数组,其中函数前面的参数都是会被注入到函数形参上面的 
myModule.controller('MyCtrl', ['$scope', function($scope){ 
  $scope.loadData=function(){ 
    console.log("加载数据中..."); 
  } 
}]); 
myModule.controller('MyCtrl2', ['$scope', function($scope){ 
  $scope.loadData2=function(){ 
    console.log("加载数据中...22222"); 
  } 
}]);

这时候在我们的指令中如何调用方法呢,按照上面的方式的话那么那么就会面临问题:MyCtrl2没有我们的loadData,而只有loadData2!这时候我们就需要使用后面的指令自定义属性了!

我们定义了两个controller控制器,分别为MyCtrl,MyCtrl2,这两个控制器都使用了我们自己定义的指令load:

<!doctype html> 
<html ng-app="MyModule"> 
  <head> 
    <meta charset="utf-8"> 
  </head> 
  <body> 
  <!--第一个控制器MyCtrl--> 
    <div ng-controller="MyCtrl"> 
      <loader howToLoad="loadData()">滑动加载</loader> 
    </div> 
    <!--第二个控制器MyCtrl2--> 
    <div ng-controller="MyCtrl2"> 
      <loader howToLoad="loadData2()">滑动加载</loader> 
    </div> 
  </body> 
  <script src="framework/angular-1.3.0.14/angular.js"></script> 
  <script src="Directive&Controller.js"></script> 
</html>

我们自定义了Controller代码如下:

var myModule = angular.module("MyModule", []); 
//首先定义一个模块并在模块下挂载控制器,第二个参数为一个数组,其中函数前面的参数都是会被注入到函数形参上面的 
myModule.controller('MyCtrl', ['$scope', function($scope){ 
  $scope.loadData=function(){ 
    console.log("加载数据中..."); 
  } 
}]); 
myModule.controller('MyCtrl2', ['$scope', function($scope){ 
  $scope.loadData2=function(){ 
    console.log("加载数据中...22222"); 
  } 
}]); 
//在模块下挂载一个loader指令 
myModule.directive("loader", function() { 
  return { 
    restrict:"AE",//Element,Attribute 
    link:function(scope,element,attrs){ 
      element.bind('mouseenter', function(event) { 
        //scope.loadData(); 
        // scope.$apply("loadData()"); 
        // 注意这里的坑,howToLoad会被转换成小写的howtoload 
        // scope.$apply(attrs.howtoload); 
        //其中scope为POJO,但是有一系列的工具方法如$watch,$apply等 
      }); 
    } 
  }  
});

很显然这里有两个控制器,分别为MyCtrl和MyCtrl2,我们的指令如何知道调用那一个Controller?这时候我们就需要为我们的指令指定不同的属性,用这个属性来判断不同的controller调用,这样我们的指令就可以在不同的controller中调用了!

总结:之所以定义指令就是为了复用,为了让指令和不同的控制器进行交互就会为指令定义不同的配置项,这就是指令和控制器进行数据交互的原理之所在!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
简单几行JS Code实现IE邮件转发新浪微博
Jul 03 Javascript
js 表单提交后按钮变灰的实例代码
Aug 16 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 #Javascript
JS简单实现自定义右键菜单实例
May 31 #Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 #Javascript
基于react框架使用的一些细节要点的思考
May 31 #Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
May 31 #Javascript
使用原生js写ajax实例(推荐)
May 31 #Javascript
Javascript创建类和对象详解
May 31 #Javascript
You might like
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
Javascript事件实例详解
2013/11/06 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
python3设计模式之简单工厂模式
2017/10/17 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
Python列表解析操作实例总结
2020/02/26 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
简单的Python人脸识别系统
2020/07/14 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
关于Java finally的面试题
2016/04/27 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
申报优秀教师材料
2014/12/16 职场文书
辞职信标准格式
2015/02/27 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL