详解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 相关文章推荐
prototype 学习笔记整理
Jul 17 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
Jun 24 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
Sep 01 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
基于Bootstrap表单验证功能
Nov 17 Javascript
原生javascript AJAX 三级联动的实现代码
May 04 Javascript
如何在Angular应用中创建包含组件方法示例
Mar 23 Javascript
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
ES6 Array常用扩展的应用实例分析
Jun 26 Javascript
在Webpack中用url-loader处理图片和字体的问题
Apr 28 Javascript
Node.js API详解之 assert模块用法实例分析
May 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
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
Python的净值数据接口调用示例分享
2016/03/15 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
VC++笔试题
2014/10/13 面试题
一套C++笔试题面试题
2012/06/06 面试题
北京英语导游词
2015/02/12 职场文书
财务工作个人总结
2015/02/27 职场文书
小学庆六一主持词
2015/06/30 职场文书
公证书
2019/04/17 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书