指令与控制器之间通信,无非是以下几种方法:

  1. 基于scope继承的方式
  2. 基于event传播的方式
  3. service的方式

基于scope继承的方式

最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将继承父控制器Parent的scope。这样,Child就可以访问到Parent的scope中的所有函数和变量了。

需要注意的是,由于scope的继承是基于Js的原型继承,如果变量是基本类型的,那在Child中的修改(写),有可能会导致Parent中的数据变脏。如下:

基本类型以及引用类型变量的继承

DEMO代码中我们看到,两个_value,其中一个 _value 属性是直接被注册到 $scope 中,另一个 _value 是注册到 parent 控制的 $scope.obj 中,DEMO效果如下:

  1. child能读取到parent中的_value值,所以默认页面 显示的是4个 default值
  2. 如果先改变了直接注册在child上 $scope 上的 _value 属性,则直接注册在 parent.$scope 的 _value 跟直接注册在 chile.$scope 的 _value 失去了联系,页面上的表现:就是如果先点击了child的按钮,点击parent的按钮 child.$scope 上的 _value 则不会变化。
  3. 反过来,如果未对直接注册在 chile.$scope 的_value进行改写,则注册在 parent.$scope 的 _value 跟chile.$scope 的 _value还有联系,页面上表现跟以上相反。
  4. 而注册在 obj 上的 _value 属性,则一直是有联系的。

经过以上实验,我们得出一下结论:

子级scope改写的属性不要直接注册在 $scope 对象上,而应该尽可能注册在 $scope 上的引用类型上,一面污染$scope。

基于event传播的方式

通过 scope 继承 能处理父子级控制器之间的通信问题,但是不能处理兄弟/相邻控制器之间的通信问题。而基于 event 传递的方式进行通信可以解决父子级的通信问题。angular提供了三个方法:$on , $emit , $broadcast

子–>父:$emit

event传播过程是这样的:

  • 子scope中的控制器通过 $scope.$emit 注册一个向上传播的事件
  • 该事件会经过每一层的父scope,但是每一层父scope不会去处理
  • 如果要处理,就在想要处理的父scope中使用 $scope.$on 监听,就好了

DEMO

跟JS中的DOM事件一样,如果你不想让你的事件再往更上层传播,在$on中的处理函数调用e.stopPropagation()即可。

父–>子:$broadcast

从父到子,跟子集到父级一样,使用同样用$broadcast注册时间,用 $on 监听着,DEMO

同级之间

拥有同个父scope的子级scope之间,也就是兄弟/相邻scope之间的通信,其实是借助共同父级传递消息的:

  • 子级scope中有谁想传消息了,$emit 一个给“奶爸”
  • 然后通过“奶爸” $broadcast 给所有孩子这个相同的信息,当然发出信息的那个可以选择是否要忽略掉自己发出的信息

angular服务的方式

在angular中服务是一个单例,在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。参照以下例子,在一个控制器修改了服务对象的值,在另一个相邻控制器中获取到修改后的值:

DEMO

AngularJS 控制器通信的更多相关文章

  1. angularjs控制器之间通信,事件通知服务

    service要记住一点就是所有的services都是singleton(单例)的,service更多的是做一些业务逻辑,数据交互.当然,利用单例这特点也可以用来做不同控制器间的通信.控制器间的通信也 ...

  2. AngularJS控制器

    AngularJS 控制器 控制 AngularJS 应用程序的数据,控制器是常规的 JavaScript 对象. 1. angular.module(name, [requires], [confi ...

  3. AngularJS 控制器

    AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 AngularJS 应用程序被控制 ...

  4. AngularJS 控制器 ng-controller

    AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 应用程序被控制器控制. ng-contro ...

  5. AngularJS学习之旅—AngularJS 控制器(六)

    1.AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript ...

  6. AngularJS 1.x系列:AngularJS控制器(3)

    1. 控制器(Controller)定义 控制器(Controller)在AngularJS中作用是增强视图(View),AngularJS控制器是一个构造方法,用来向视图(View)中添加额外功能. ...

  7. AngularJS控制器和AngularJS过滤器的学习(3)

    前面简单的学习了AngularJS的表达式和指令,就可以说大概对AngularJS有了一定的了解吧,嘿嘿,下面就来总结学习一下AngularJS的控制器和过滤器哦. 说起来AngularJS控制器,其 ...

  8. AngularJS 控制器的方法

    AngularJS 控制器也有方法(变量和函数) <!DOCTYPE html><html><head><meta http-equiv="Cont ...

  9. 【06】AngularJS 控制器

    AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 Ang ...

随机推荐

  1. HDU 6092 Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. C++求出旋转数组的最小数字

    今天遇到这么一道题目,感觉很有意思,要记下来! 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...

  3. 八皇后问题 dfs/递归

    #include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...

  4. JAVA中文乱码之解决方案

    1.解决HTML页面的中文问题:为了使HTML页面很好的支持中文,在每个HTML页面的<head>标签内部增加(创建HTML页面自带) <head> <meta char ...

  5. Fiddler手机抓包图文教程

    上篇Fiddler教程,我们教了大家Fiddler安装配置及如何使用Fiddler进行基本的Http抓包及模拟请求,今天给大家介绍下如何使用Fiddler进行手机抓包. 运行环境为Windows 10 ...

  6. 两个Xml转换为DataSet方法(C#)

    ///通过传入的特定XML字符串,通过 ReadXml函数读取到DataSet中.protected static DataSet GetDataSetByXml(string xmlData){   ...

  7. Cloudstack网络分析-基本网络

    前言 相信对于很多初学者或者使用者来说,刚开始接触Cloudstack的时候可能会被Cloudstack的网络概念弄得有些糊涂,例如,基础网络,高级网络,细之网络流量分类(公共,管理,来宾,存储),这 ...

  8. MXNet之ps-lite及parameter server原理

    MXNet之ps-lite及parameter server原理 ps-lite框架是DMLC组自行实现的parameter server通信框架,是DMLC其他项目的核心,例如其深度学习框架MXNE ...

  9. JSON.parse()和JSON.stringify()和eval('(' + result + ')')

    var str = '{"name":"huangxiaojian","age":"23"}' 结果: JSON.par ...

  10. JS规范2

    百度SS Javascript编码规范 1.变量.方法命名必须匹配正则:/^[$_a-zA-Z]\w*$/ /** * 虽然Javascript引擎支持多种格式命名的变量, * 比如下面这样的变量,J ...