详解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 18 Javascript
javascript 时间比较实现代码
Oct 28 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
May 06 Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
使用jQuery实现动态添加小广告
Jul 11 jQuery
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
node基于puppeteer模拟登录抓取页面的实现
May 09 Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 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数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python理解递归的方法总结
2019/01/28 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Intersport西班牙:在线体育商店
2019/11/06 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
实习教师自我鉴定
2013/09/27 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
代领报检证委托书范本
2014/10/11 职场文书
红色革命电影观后感
2015/06/18 职场文书
岗位聘任协议书
2015/09/21 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书