angularJS控制器之间的相互通信方式、$broadcast、$emit、$on
在项目中,我们可能会很经常性的利用到控制器之间的相互通信,在angular中的控制器之间的相互通信有以下几种方式:
1)通过本地数据的存储localstorage,sessionstorage,
2)通过rootScope,顶级作用域
3)通过$broadcast,$on,$emit的方式进行通信
在此就讲解下如何通过第三种方式进行通信的问题:
$broadcast:顾名思义是广播的意思,一般用于父级控制器向子控制器传递信息的方法。
$emit:主要是用于子控制器向父控制器传递信息的方法。
$on:用于接收$broadcast,$emit的消息
情况一:父---->子之间的通信($broadcast)
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.controller("child", function($scope) {
$scope.$on("parentChange", function(e, m) {//参数一:监听的事件名,回调函数的参数一:以对象的形式返回相关数据,参数二:你传递的参数
$scope.change = "changed";
$scope.child = m;
})
})
.controller("parent", function($scope) {
$scope.$watch("parent", function(n, o) {
if (n == o) {
return;
}
$scope.$broadcast("parentChange", n)
})
})
</script> <body>
<div ng-controller="parent">
Parent: {{parent}}
<input type="text" ng-model="parent"> <div ng-controller="child">
{{change}} Child: {{child}}
</div>
</div>
</body>
情况二:子--->父的通信 ($emit)
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.controller("parent", function($scope) {
$scope.$on("childChange", function(e, m) {
$scope.change = "changed";
$scope.parent = m
})
})
.controller("child", function($scope) {
$scope.$watch("child", function(n, o) {
if (n == o) {
return;
}
$scope.$emit("childChange", n)
})
})
</script> <body ng-controller="parent">
{{change}} Parent: {{parent}}
<div ng-controller="child">
Child: {{child}}
<input type="text" ng-model="child">
</div>
</body>
第三种:同级的兄弟控制器之间的相互通信(要额外定义一个服务)
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.service("myServive", function($rootScope) {
return {
change: function(n) {
$rootScope.$broadcast("valueChange", n); }
}
})
.controller("bro1", function($scope, myServive) {
$scope.$watch("value1", function(n) {
myServive.change(n);
}) $scope.$on("valueChange", function(e, m) {
console.log("value1");
$scope.value1 = m;
})
})
.controller("bro2", function($scope, myServive) {
$scope.$watch("value2", function(n) {
myServive.change(n);
}) $scope.$on("valueChange", function(e, m) {
console.log("value2");
$scope.value2 = m;
})
})
</script> <body>
<div ng-controller="bro1">
<h3> value1:</h3>
<input type="text" ng-model="value1">
</div>
<div ng-controller="bro2">
<h3>value2:</h3>
<input type="text" ng-model="value2">
</div>
</body>
同级控制器之间的相互通信,比起前面两种情况确实来的稍微复杂一点,但是本质上还是利用的上一级的控制器进行通信(以服务的方式)
写这篇文章的原因就是在我的项目中我遇到了一个需求:我的页面中会用到angular-bootstrap的模态弹出框,现在要求模态框是没用内容的,通过z-index设置页面的内容(而非模态框)让其浮现到模态框上面(他有两个按钮),通过点击这两个按钮让模态框消失(已经设置模态框的backdtop:'static'),【之前都是点击模态框“确认”,“取消”按钮才消失模态框】,现在是通过点击页面的上的两个按钮(与模态框没有联系)让它消失。
这个时候就需要通过同级控制器之间的相互通信。
angularJS控制器之间的相互通信方式、$broadcast、$emit、$on的更多相关文章
- angularjs控制器之间的数据共享与通信
1.可以写一个service服务,从而达到数据和代码的共享; var app=angular.module('app',[]); app.service('ObjectService', [Objec ...
- angularjs控制器之间通信,事件通知服务
service要记住一点就是所有的services都是singleton(单例)的,service更多的是做一些业务逻辑,数据交互.当然,利用单例这特点也可以用来做不同控制器间的通信.控制器间的通信也 ...
- 《AngularJS》--指令的相互调用
转载自http://blog.csdn.net/zhoukun1008/article/details/51296692 人们喜欢AngularJS,因为他很有特色,其中他的指令和双向数据绑定很吸引着 ...
- AngularJS中控制器之间通信方法
在同个angular应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种: 基于scope继承的方式和基于event传播的方式 基于scope继承的方式 最简单的让控制器之间进行通信的方法是 ...
- angularjs 控制器、作用域、广播详解
一.控制器 首先列出几种我们平常使用控制器时的几种误区: 我们知道angualrJs中一个控制器时可以对应不同的视图模板的,但这种实现方式存在的问题是: 如果视图1和视图2根本没有任何逻辑关系,这样& ...
- AngularJS 控制器通信
指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制器之间进行通信的方法是通过scope的继承 ...
- angularJS--多个控制器之间的数据共享
为了在控制器之间共享数据,需要在服务中添加一个用来储存用户名的方法.记住,服务在 应用的生命周期内是单例模式的,因此可以将用户名安全地储存在其中. <!DOCTYPE html> < ...
- AngularJS 1.x系列:AngularJS控制器(3)
1. 控制器(Controller)定义 控制器(Controller)在AngularJS中作用是增强视图(View),AngularJS控制器是一个构造方法,用来向视图(View)中添加额外功能. ...
- angular开发控制器之间的通信
一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ...
随机推荐
- HDU 4274 Spy's Work (树形DP)
题意 给定一棵树,给出一些子树的权值关系,问是否矛盾(初始所有结点的下限为1) 思路 设lmin和lmax表示题目给定的限制范围,默认为[1..oo]:amin和amax表示实际符合要求的范围.从根节 ...
- Java复习5.面向对象
Java 复习5面向对象知识 20131004 前言: 前几天整理了C++中的面向对象的知识,学习Java语言,当然最重要的就是面向对象的知识,因为可以说Java是最正宗的面向对象语言,相比C++,更 ...
- 五.dbms_transaction(用于在过程,函数,和包中执行SQL事务处理语句.)
1.概述 作用:用于在过程,函数,和包中执行SQL事务处理语句. 2.包的组成 1).read_only说明:用于开始只读事务,其作用与SQL语句SET TRANSACTION READ ONLY完全 ...
- This function has none of DETERMINISTIC, NO SQL解决办法
This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...
- ant+jmeter+jenkins+git持续集成以及邮件报告展示
前序准备工作: ant--下载地址:http://ant.apache.org/bindownload.cgi jmeter--下载地址:http://jmeter.apache.org/downlo ...
- pg_bulkload使用记录
很久之前就使用过pg_bulkload来导入数据了,并做了对比试验,现在另一个项目又需要用了,这里做个记录: 1.rpm包比较老,下下来之后发现只支持到pg94,目前我用的是pg10,因此放弃. 2. ...
- Django项目的ORM操作之--数据模型类创建
在django项目中,其自带了ORM(Object Relation Mapping)对象关系映射框架,我们在django项目下app的models模块下对类进行操作,通过ORM会将我们对类的操作转化 ...
- 使用strdup 和 _strdup
在重构旧的C代码里,使用了这个函数, pNew = new OBJECTDESC; sscanf(buf, "%x", &i); pNew->wObjectID = ...
- Ubuntu在图形界面和命令行界面都循环登录解决办法
在做机器ip变化自动发送邮件的时候,在/etc/profile.d/目录下添加了一个脚本,重启的时候就循环登录了,无论是在图形界面还是命令行界面. 解决方法:利用系统U盘进入系统进行修改,具体如下: ...
- pdf 数据流解析
根据这个解释可以认为,/CCITTFaxDecode应该指单色图像(每个像素占8位?还是1位),FlateDecode 指文字或者矢量图片(png) 参考论文:http://www.doc88.co ...