详解angularjs中如何实现控制器和指令之间交互

发布时间 - 2026-01-11 01:33:58    点击率:

如果我们具有下面的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中调用了!

总结:之所以定义指令就是为了复用,为了让指令和不同的控制器进行交互就会为指令定义不同的配置项,这就是指令和控制器进行数据交互的原理之所在!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angularjs  # 指令控制器  # angular指令和控制器  # angular  # 指令交互  # 深入讲解AngularJS中的自定义指令的使用  # 详解AngularJS中自定义指令的使用  # AngularJS创建自定义指令的方法详解  # AngularJS使用自定义指令替代ng-repeat的方法  # Angularjs自定义指令实现三级联动 选择地理位置  # Angularjs使用directive自定义指令实现attribute继承的方法详解  # angularjs 表单密码验证自定义指令实现代码  # AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法  # AngularJS自定义指令实现面包屑功能完整实例  # AngularJS自定义指令之复制指令实现方法  # AngularJS指令与控制器之间的交互功能示例  # AngularJS实现自定义指令与控制器数据交互的方法示例  # 加载  # 都是  # 第二个  # 并在  # 这时候  # 自定义  # 分别为  # 转换成  # 就可以  # 有一  # 就会  # 第一个  # 这就是  # 这两个  # 会为  # 大家多多  # 复用  # 器中  # 使用了  # 有两个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel如何使用withoutEvents方法临时禁用模型事件  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  QQ浏览器网页版登录入口 个人中心在线进入  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何快速上传建站程序避免常见错误?  IOS倒计时设置UIButton标题title的抖动问题  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  EditPlus 正则表达式 实战(3)  javascript中闭包概念与用法深入理解  千库网官网入口推荐 千库网设计创意平台入口  网站建设保证美观性,需要考虑的几点问题!  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何用搬瓦工VPS快速搭建个人网站?  如何在Windows服务器上快速搭建网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  EditPlus中的正则表达式 实战(2)  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何在新浪SAE免费搭建个人博客?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何构建满足综合性能需求的优质建站方案?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  大型企业网站制作流程,做网站需要注册公司吗?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在建站之星绑定自定义域名?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  深圳网站制作的公司有哪些,dido官方网站?  JS碰撞运动实现方法详解  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何基于云服务器快速搭建网站及云盘系统?  如何自定义建站之星模板颜色并下载新样式?  如何在VPS电脑上快速搭建网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在阿里云虚拟服务器快速搭建网站?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  个人摄影网站制作流程,摄影爱好者都去什么网站?