AngularJS实战之Controller之间的通信
我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式
一、使用$on、$emit和$broadcast进行controller通信
虽然AngularJS是不推荐使用嵌套controller的使用,但是会有场景使用到父子controller传值的情况
$on、$emit和$broadcast使得event、data在controller之间的传递变的简单。
$emit:子传父 传递event与data
$broadcast:父传子 child controller传递event与data
$on:监听或接收数据。。用于接收event与data
例子:
<body>
<div ng-controller="parentController">
<div ng-click="parent_onclick()" style="background-color: green;">我是父亲{{parent}}</div>
<div ng-controller="childController">
<div ng-click="child_onclick()" style="background-color: red;">我是子集{{child}}</div>
</div>
</div>
</body>
<script type="text/javascript" src="../plugins/angular/angular.js"></script>
<script type="text/javascript">
var lxApp = angular.module("lxApp", []);
lxApp.controller("parentController", function($scope) {
$scope.$on("sendParent", function(event, data) {
$scope.parent = data;
});
$scope.parent_onclick = function() {
$scope.$broadcast('sendChild', '我给子控制器传递数据');
};
}).controller("childController", function($scope) {
$scope.$on("sendChild", function(event, data) {
$scope.child = data;
});
$scope.child_onclick = function() {
$scope.$emit('sendParent', '我给父级传递数据'); };
});
</script>
你会发现点击父级的div会使用$scope.$broadcast传递'sendChild'到子集,子集也会使用$on来监听父级传递的值。熟悉一下即可使用这种传值方式。
二、使用SERVICES(服务)来实现值的传递
var lxApp = angular.module("lxApp", []);
接下来创建一个新的服务,服务里面定义一个鱼的数组,然后在使用addFish 方法添加鱼
lxApp.service('lxAppService', function($rootScope) {
var service = {
fishs : [ {
title : "鲨鱼",
area : "sea"
}, {
title : "鲸鱼",
area : "sea"
} ],
addFish : function(fish) {
service.fishs .push(fish);
}
};
return service;
});
接下来是controller和html的创建
<div ng-controller="parentController">
<div ng-click="parent_onclick()" style="background-color: green;">我要向大海添加鱼</div>
<div ng-controller="childController">
<div ng-click="child_onclick()" style="background-color: red;">我要获得鱼</div>
</div>
</div>
lxApp.controller("parentController", function($scope,lxAppService) {
$scope.parent_onclick = function() {
lxAppService.addFish({
title : "海豚",
area : "sea"
} );
alert(lxAppService.fishs);
};
}).controller("childController", function($scope,lxAppService) {
$scope.child_onclick = function() {
alert(angular.toJson(lxAppService.fishs));
};
});
展示点击父级的div调用父作用域的方法添加鱼,点击子集调用子集作用域的方法获得鱼

三、使用作用域进行controller的通信
div:
<div ng-controller="parentController">
<div style="background-color: green;">我是父级</div>
<div ng-controller="childController">
<div ng-click="child_onclick()" style="background-color: red;">我是获得父级的名字</div>
</div>
</div>
controller:
lxApp.controller("parentController", function($scope) {
$scope.name="1212";
}).controller("childController", function($scope,$rootScope) {
$scope.child_onclick = function() {
alert($scope.name);
};
});
效果

这里我们会看到在父级定义的name在子集里面也可以获取到,这是AngularJS作用域机制,当我们调用子集的方法打印$scope.name,这时候会一直往父级向上的作用域中到$rootScope找name,所以这时候会打印出name。
最后就是可以使用根作用域$rootScope来获取不同controller的值。
AngularJS监听数组变化
AngularJS的$location基本用法和注意事项
AngularJS 无限滚动加载数据控件 ngInfiniteScroll
AngularJS实战之ng-repeat的详细用法
ng-show和ng-if的区别和使用场景
AngularJS实战之路由ui-view传参
AngularJS实战之filter的使用二
AngularJS实战之filter的使用一
AngularJS实战之路由ui-view
AngularJS实战之Controller之间的通信的更多相关文章
- AngularJS进阶(九)控制器controller之间如何通信
AngularJS控制器controller之间如何通信 注:请点击此处进行充电! angular控制器通信的方式有三种: 1,利用作用域继承的方式.即子控制器继承父控制器中的内容 2,基于事件的方式 ...
- angularJS中directive与controller之间的通信
当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢? 这里介绍3种angular自定义directive与controller通信的 ...
- AngularJS 中 Controller 之间的通信
用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文对此进行一个总结. 在 Angular 中,Controller 之间通信的方式主要有三种: 1)作用域继承.利 ...
- Angularjs controller之间的通信
刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: <html> <script src=" ...
- angularjs 不同的controller之间值的传递
Sharing data between controllers in AngularJS I wrote this article to show how it can possible to pa ...
- angularJS中directive与directive 之间的通信
上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被 ...
- angularJS的controller之间如何正确的通信
AngularJS中的controller是个函数,用来向视图的作用域($scope)添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在创建新的控制器时,angularJ ...
- angularjs中控制器之间的通信----$on、$emit和$broadcast解析
$on.$emit和$broadcast使得event.data在controller之间的传递变的简单. $emit只能向parent controller传递event与data $broadca ...
- angularjs 中使用 service 在controller 之间 share 对象和数据
在做angularjs 的UI 时,我们经常会遇到一个页面之间有几个controller,在controller 之间share 公共的一些数据和方法就变得比较困难,目前推荐的做法是创建一个servi ...
随机推荐
- MVC中的七层架构
工厂模式的七层架构 1.创建Model,实现业务实体. 2.创建IDAL,实现接口. 3.创建DAL,实现接口里的方法. 4.创建DBUtility,数据库操作类5.创建DALFactory,抽象工程 ...
- go语言使用go-sciter创建桌面应用(七) view对象常用方法,文件选择,窗口弹出,请求
view对象的详细文档请看: https://sciter.com/docs/content/sciter/View.htm demo9.html代码如下: <!DOCTYPE html> ...
- go语言中的反射reflect
package main; import ( "fmt" "reflect" ) //反射refection //反射使用TypeOf和ValueOf函数从接口 ...
- sql backup
create or replace procedure P_updateasbegin update security_price p set p.closing_price = (select MI ...
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- Java 常见面试题(一)
1)什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设 ...
- gerrit管理下的git代码提交小技巧
1.提交代码git checkout targetbranch 切换至目标分支git pull origin targetbranch 拉取目标分支最新内容git add 修改文件git commit ...
- Node.js v7.4.0 Documentation Addons
https://nodejs.org/docs/latest/api/addons.html Node.js Addons are dynamically-linked shared objects, ...
- Python编程笔记(第二篇)二进制、字符编码、数据类型
一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存储单位,1bytes缩写为1B 1KB = 10 ...
- swift 官方获取JSON 数据方法
var url = NSURL(string: "http://www.weather.com.cn/data/sk/101120501.html") var data = NSD ...