详解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 到 JQuery (1)学习小结
Feb 12 Javascript
IE和firefox浏览器的event事件兼容性汇总
Dec 06 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
javascript中比较字符串是否相等的方法
Jul 23 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
node中的session的具体使用
Sep 14 Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
在Python中进行自动化单元测试的教程
2015/04/15 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python验证企业工商注册码
2015/10/25 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
python将数组n等分的实例
2019/12/02 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
2013年军训通讯稿
2014/02/05 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
罗马假日观后感
2015/06/08 职场文书
归途列车观后感
2015/06/17 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL