详解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 相关文章推荐
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
Dec 09 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
js获得当前系统日期时间的方法
May 06 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
JavaScript toUpperCase()方法使用详解
Aug 26 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
Vue.js动态组件解析
Sep 09 Javascript
详解node单线程实现高并发原理与node异步I/O
Sep 21 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
uni-app实现获取验证码倒计时功能
Nov 01 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
用mysql内存表来代替php session的类
2009/02/01 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
js创建对象的方式总结
2015/01/10 Javascript
js比较日期大小的方法
2015/05/12 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
js倒计时抢购实例
2015/12/20 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
Python专用方法与迭代机制实例分析
2014/09/15 Python
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python写日志封装类实例
2015/06/28 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
意向协议书范本
2014/04/23 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
客户答谢会致辞
2015/01/20 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书