详解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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
JavaScript 不只是脚本
May 30 Javascript
帮助避免错误的Javascript陷阱清单
May 31 Javascript
浅谈Javascript中匀速运动的停止条件
Dec 19 Javascript
js操作滚动条事件实例
Jan 29 Javascript
JavaScript动态改变div属性的实现方法
Jul 22 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
js用类封装pop弹窗组件
Oct 08 Javascript
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
基于Angularjs-router动态改变Title值的问题
Aug 30 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 Javascript
JS常见错误(Error)及处理方案详解
Jul 02 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python max内置函数详细介绍
2016/11/17 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
python and or用法详解
2019/06/26 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
英国最大的海报商店:GB Posters
2018/03/20 全球购物
学校大课间活动方案
2014/01/30 职场文书
股东合作协议书
2014/04/14 职场文书
语文复习计划
2015/01/19 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
采购部年度工作总结
2015/08/13 职场文书