详解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 面向对象全新理练之继承与多态
Dec 03 Javascript
JavaScript中的View-Model使用介绍
Aug 11 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
js 得到文件后缀(通过正则实现)
Jul 08 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
May 18 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
Dec 18 Javascript
javascript制作sql转换为stringBuffer的小工具
Apr 03 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
详细介绍解决vue和jsp结合的方法
Feb 06 Javascript
微信小程序实现多行文字滚动
Nov 18 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构造函数实例讲解
2013/11/13 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
理解Javascript闭包
2013/11/01 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
javascript实现留言板功能
2020/02/08 Javascript
python读取Android permission文件
2013/11/01 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Django中的session用法详解
2020/03/09 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
python如何实现word批量转HTML
2020/09/30 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
模具专业毕业推荐信
2014/03/08 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
房屋质量投诉书
2015/07/02 职场文书
信息技术课教学反思
2016/02/23 职场文书