详解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 相关文章推荐
模拟用户操作Input元素,不会触发相应事件
May 11 Javascript
JavaScript中的其他对象
Jan 16 Javascript
document.documentElement的一些使用技巧
Apr 18 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
Jan 06 Javascript
jquery下div 的resize事件示例代码
Mar 09 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
Aug 12 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
Sep 06 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
express如何解决ajax跨域访问session失效问题详解
Jun 20 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 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中strtotime函数使用方法详解
2011/11/27 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
python批量修改交换机密码的示例
2020/09/22 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
Django如何重置migration的几种情景
2021/02/24 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
编程用JAVA解析XML的方式
2013/07/07 面试题
演讲稿格式范文
2014/05/19 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
2014年党总支工作总结
2014/12/18 职场文书
golang slice元素去重操作
2021/04/30 Golang
pytorch中的numel函数用法说明
2021/05/13 Python
python编程项目中线上问题排查与解决
2021/11/01 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android