详解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 相关文章推荐
wap图片滚动特效无css3元素纯js脚本编写
Aug 22 Javascript
js实现仿Windows风格选项卡和按钮效果实例
May 13 Javascript
js window对象属性和方法相关资料整理
Nov 11 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
Aug 15 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
JS简单实现滑动加载数据的方法示例
Oct 18 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
7个好用的JavaScript技巧分享(译)
May 07 Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 Javascript
vue实现修改图片后实时更新
Nov 14 Javascript
JS实现点击掉落特效
Jan 29 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 flv视频时间获取函数
2010/06/29 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python 序列的方法总结
2016/10/18 Python
python的Tqdm模块的使用
2018/01/10 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
英国自行车商店:AW Cycles
2021/02/24 全球购物
初中班主任评语
2014/04/24 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
反腐倡廉标语
2014/06/24 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
黄山导游词
2015/01/31 职场文书
酒店开业主持词
2015/07/02 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python