angular开发控制器之间的通信
一、指令与控制器之间通信,无非是以下几种方法:
基于scope继承的方式
基于event传播的方式
service的方式(单例模式)
二、基于scope继承的方式:
最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将继承父控制器Parent的scope。这样,Child就可以访问到Parent的scope中的所有函数和变量了。
需要注意的是,由于scope的继承是基于Js的原型继承,如果变量是基本类型的,那在Child中的修改(写),有可能会导致Parent中的数据变脏。
例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>基于scope继承的方式</title>
</head>
<body ng-app = "myApp">
<div ng-controller = "parent">
<p>引用类型:{{obj.value}}</p>
<p>引用类型:{{value}}</p>
<a href="javascript:;" ng-click = "parent('parent')">点我</a>
<div ng-controller="child">
<p>引用类型:{{obj.value}}</p>
<p>引用类型:{{value}}</p>
<a href="javascript:;" ng-click = "child('child')">点我</a>
</div>
</div> <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
<script>
var app = angular.module("myApp",[],function(){console.log("start")});
app.controller("parent",function($scope){
$scope.parent = function(newchild){
// 这里不能都单独写成$scope.obj={value:newchild}
$scope.obj={value:newchild};
$scope.value = newchild;
}
});
app.controller("child",function($scope){
$scope.child = function(newchild){
$scope.value = newchild;
$scope.obj.value=newchild;
} });
</script>
</body>
</html>
三、基于事件的方式:
在一般情况下基于继承的方式已经足够满足大部分情况了,但是这种方式没有实现兄弟控制器之间的通信方式,所以引出了事件的方式 。基于事件的方式中我们可以里面作用的$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件。
子到父 通过 $emit 注册事件,例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>基于事件传播子到父</title>
</head>
<body ng-app = "myApp">
<h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3>
<div ng-controller = "parent">
<p>引用类型:{{value}}</p>
<div ng-controller="child">
<a href="javascript:;" ng-click = "child('child')">子传值到父</a>
</div>
</div> <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
<script>
var app = angular.module("myApp",[],function(){console.log("start")});
app.controller("parent",function($scope){
$scope.$on("pfan",function(e,data){
$scope.value = data;
}) });
app.controller("child",function($scope){
$scope.child = function(newchild){
$scope.value = newchild;
$scope.$emit("pfan",$scope.value)
} });
</script>
</body>
</html>
父到子通过$broadcast注册事件,但其实感觉有点多余,本事父就是可以共享给子的,例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>基于事件传播父到子</title>
</head>
<body ng-app = "myApp">
<h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3> 基于事件传播父到子,这里本事父就可以到子,感觉有点多余
<div ng-controller = "parent">
<a href="javascript:;" ng-click = "parent('child')">子传值到父</a> <div ng-controller="child">
<p>引用类型:{{value}}</p>
</div>
</div> <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
<script>
var app = angular.module("myApp",[],function(){console.log("start")});
app.controller("parent",function($scope){
$scope.parent = function(newchild){
$scope.value = newchild;
$scope.$broadcast("pfan",$scope.value)
} });
app.controller("child",function($scope){
$scope.$on("pfan",function(e,data){
$scope.value = data;
}) });
</script>
</body>
</html>
同级之间
拥有同个父scope的子级scope之间,也就是兄弟/相邻scope之间的通信,其实是借助共同父级传递消息的:
子级scope中有谁想传消息了,$emit 一个给“奶爸”
然后通过“奶爸” $broadcast 给所有孩子这个相同的信息,当然发出信息的那个可以选择是否要忽略掉自己发出的信息
四、angular服务的方式:
在ng中服务是一个单例,所以在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。参照以下例子,在一个控制器修改了服务对象的值,在另一个控制器中获取到修改后的值:
var app = angular.module('myApp', []);
app.factory('instance', function(){
return {};
});
app.controller('MainCtrl', function($scope, instance) {
$scope.change = function() {
instance.name = $scope.test;
};
});
app.controller('sideCtrl', function($scope, instance) {
$scope.add = function() {
$scope.name = instance.name;
};
});
//html
<div ng-controller="MainCtrl">
<input type="text" ng-model="test" />
<div ng-click="change()">click me</div>
</div>
<div ng-controller="sideCtrl">
<div ng-click="add()">my name {{name}}</div>
</div>
参考资料:
angular开发控制器之间的通信的更多相关文章
- AngularJs开发——控制器间的通信
AngularJs开发——控制器间的通信 指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制 ...
- angular 控制器之间的通信
1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...
- angular中控制器之间的通讯方式
1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...
- iOS开发控制器之间传值的几种小方法
在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...
- angular中控制器之间传递参数的方式
在angular中,每个controller(控制器)都会有自己的$scope,通过为这个对象添加属性赋值,就可以将数据传递给模板进行渲染,每个$scope只会在自己控制器内起作用,而有时候需要用到其 ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- angularjs中控制器之间的通信----$on、$emit和$broadcast解析
$on.$emit和$broadcast使得event.data在controller之间的传递变的简单. $emit只能向parent controller传递event与data $broadca ...
- Angular 2 组件之间如何通信?
组件之间的共享可以有好几种方式 http://learnangular2.com/outputs/ 实例参考https://angular.io/docs/ts/latest/cookbook/com ...
- Angular:组件之间的通信@Input、@Output和ViewChild
①父组件给子组件传值 1.父组件: ts: export class HomeComponent implements OnInit { public hxTitle = '我是首页的头部'; con ...
随机推荐
- wordpress主题升级之后返回到原来版本主题的方法
wordpress后台经常可以看到主题提示升级,但是发现升级之后样式,颜色等都变了,不是以前的样子了,这时候如果想要返回到以前版本,前提,必须以前版本有备份. 在wordpress里面找到主题===添 ...
- 关于High-Contrast的资料
SystemParameters.HighContrast Propertyhttp://msdn.microsoft.com/en-us/library/system.windows.systemp ...
- Linux远程管理之SVN,VNC
一.远程管理的基本概念 首先我们来初略的讲讲远程管理的一些基本概念.对于我们使用的计算机来说,如果是个人计算机,就没有远程管理这一概念了,想用的时候开机就能使用,而对于我们的服务器来说,就不同了,对于 ...
- 如何使用 MasterPage
MasterPageFile母版页 刚开始学,什么都不懂,看到了这段代码,才促使自己去研究MasterPageFile到底是什么含义.<%@ Page Language="C#&quo ...
- MTK 隐藏通知栏
步骤: 源码/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarVie ...
- [Arch] 02. Design principle and Software Pattern
Ref: 软件设计的七大原则 有时间的话,还需进一步深入理解. Figure, 重要的前五个原则 单一职责原则 (Simple responsibility pinciple SRP) 类的设计趋向于 ...
- dos命令收集
应用程序和进程相关 tasklist /svc 查看计算机当前正在运行程序 taskkill /f /im "eclipse.exe" 关闭指定的应用程序 taskk ...
- 【Oracle】强制关闭会话
select sid, serial# from V$session where sid in (select sid from v$LOCK where TYPE in ('TM','TX')); ...
- tomcat 的 server.xml配置文件
tomcat的配置文件在其安装后生成的conf目录下,其中主配置文件便是conf下的server.xml文件. server.xml文件由server->service->engine-& ...
- Spring JDBC入门
Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作. 操作JDBC时Spring可以帮我们做这些事情: 定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接 ...