详解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 获取图片颜色
Apr 05 Javascript
PNG背景在不同浏览器下的应用
Jun 22 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
Jan 30 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
Mar 06 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
js关于命名空间的函数实例
Feb 05 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
React学习之JSX与react事件实例分析
Jan 06 Javascript
vue组件的路由高亮问题解决方法
May 11 Vue.js
详解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
用mysql内存表来代替php session的类
2009/02/01 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
AngularJS表单验证功能分析
2017/05/26 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
Python中文字符串截取问题
2015/06/15 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
《都江堰》教学反思
2014/02/07 职场文书
中层干部竞聘演讲稿
2014/05/15 职场文书
师范毕业生求职信
2014/07/11 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2015年材料员工作总结
2015/04/30 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
Django与数据库交互的实现
2021/06/03 Python
Python日志模块logging用法
2022/06/05 Python