详解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 checkbox 全选/反选及批量删除
Apr 28 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
jQuery实用基础超详细介绍
Apr 11 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
javascript面向对象特性代码实例
Jun 12 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
vue 扩展现有组件的操作
Aug 14 Javascript
Vue 的 v-model用法实例
Nov 23 Vue.js
用javascript实现倒计时效果
Feb 09 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网站提速三大“软”招
2006/10/09 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
基于php无限分类的深入理解
2013/06/02 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
详解爬虫被封的问题
2019/04/23 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
开放系统互连参考模型
2016/06/29 面试题
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
计算机应用专业推荐信
2013/11/13 职场文书
小学生学习感言
2014/03/10 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
优秀员工推荐材料
2014/12/20 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
师范生见习自我总结
2015/06/23 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
vue elementUI批量上传文件
2022/04/26 Vue.js