详解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 清除输入框中的数据
Apr 13 Javascript
json格式化/压缩工具 Chrome插件扩展版
May 25 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
jquery获取子节点和父节点的示例代码
Sep 10 Javascript
基于JavaScript实现简单的随机抽奖小程序
Jan 05 Javascript
JS创建对象的写法示例
Nov 04 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
vue 实现的树形菜的实例代码
Mar 19 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
JavaScript实现雪花飘落效果
Dec 27 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 时间日期操作实战
2011/08/26 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
JS+CSS实现动态时钟
2021/02/19 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python的垃圾回收机制深入分析
2014/07/16 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
String和StringBuffer的区别
2015/08/13 面试题
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
大专生的学习自我评价
2013/12/04 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2014年评职称工作总结
2014/11/20 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript