我们时常会在不同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(服务)来实现值的传递



我们首先来创建一个module(模块)

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之间的通信的更多相关文章

  1. AngularJS进阶(九)控制器controller之间如何通信

    AngularJS控制器controller之间如何通信 注:请点击此处进行充电! angular控制器通信的方式有三种: 1,利用作用域继承的方式.即子控制器继承父控制器中的内容 2,基于事件的方式 ...

  2. angularJS中directive与controller之间的通信

    当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢? 这里介绍3种angular自定义directive与controller通信的 ...

  3. AngularJS 中 Controller 之间的通信

    用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文对此进行一个总结. 在 Angular 中,Controller 之间通信的方式主要有三种: 1)作用域继承.利 ...

  4. Angularjs controller之间的通信

    刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: <html> <script src=" ...

  5. angularjs 不同的controller之间值的传递

    Sharing data between controllers in AngularJS I wrote this article to show how it can possible to pa ...

  6. angularJS中directive与directive 之间的通信

    上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被 ...

  7. angularJS的controller之间如何正确的通信

    AngularJS中的controller是个函数,用来向视图的作用域($scope)添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在创建新的控制器时,angularJ ...

  8. angularjs中控制器之间的通信----$on、$emit和$broadcast解析

    $on.$emit和$broadcast使得event.data在controller之间的传递变的简单. $emit只能向parent controller传递event与data $broadca ...

  9. angularjs 中使用 service 在controller 之间 share 对象和数据

    在做angularjs 的UI 时,我们经常会遇到一个页面之间有几个controller,在controller 之间share 公共的一些数据和方法就变得比较困难,目前推荐的做法是创建一个servi ...

随机推荐

  1. Java构建指定大小文件

    Java快速创建指定大小的文件,最多的解决办法就是循环向文件里面入固定大小的空字节,但是这种方式构建大文件性能比较低下,因此有这样两种方式可供参考: Java有一个类:FileChannel,查阅AP ...

  2. java爬取网页Unicode转UTF-8中文

    unicode编码简而言之就是将每一个字符用16位2进制数标识.但是通常都用4位的16进制数标识. 例如: 1)中文字符串"你好"的unicode码为:\u60\u597d; 2) ...

  3. DOS下的安全空间

    我们需要直接向一段内存中写入内容: 这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误: DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码; ...

  4. 比特币系列钱包的UTXO总结

    1.通过比特币钱包的WalletNotify配置来处理 本钱包内的交易信息的 推送.BlockNotify数据更多,不适合交易所的监听

  5. Linux驱动之内核加载模块过程分析

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...

  6. (转)Java程序员简历模板

    本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. (括号里的是我们的顾问编写的说明,建议在简历书写完成后统一删除) 先讲讲怎样才是一份好的技术简历 首先,一份好的简历不光说明 ...

  7. hisat2+stringtie+ballgown

    hisat2+stringtie+ballgown Posted on 2016年11月25日 早在去年九月,我就写个博文说 RNA-seq流程需要进化啦!http://www.bio-info-tr ...

  8. Codeforces 749C. Voting 模拟题

    C. Voting time limit per test: 1 second memory limit per test: 256 megabytes input: standard input o ...

  9. lazarus的动态方法和虚拟方法

    动态方法和虚拟方法在delphi里面分别表示: 动态方法 当需要调用父类.祖先类的被覆盖方法的时候,是查找继承树,当找到,就调用.减少了VMT占用,但调用慢一些. 虚拟方法 和动态方法不同的是,记录了 ...

  10. linux学习第二天 (Linux就该这么学)

    2018年11月10日,今天是学习的第二天 今天学习了安装vmware workstation12的安装及怎么安装 redhat7系统,在新建虚拟机时注意要选择“稍后安装操作系统”要vmwark wo ...