欢迎大家指导与讨论 : )

  前言

   Angular的作用域在本质上是分层次的(有的住户在低层, 有的住户在高层), 它们可以通过父子关系很自然地进行沟通。但通常, 这种沟通是单向的(父->子的单向沟通), 并且它们的作用域不共享变量, 它们的执行功能往往也各不相同, 也与它们父树上的位置无关。因此,在这种情况下,我们可以通过在这个链上传递事件的方式在作用域之间通讯(住在第n层的居委会主席对他的手下说: '嘿! 哥们! 麻烦帮我逐层告诉这栋楼的楼上/楼下的住户, 他们该交电费啦!')。注意, 受作用的只有某条链(隔壁楼的住户可不会听你的话哦)

  彩蛋——父子作用域间共享变量

  如果才能令父子作用域间可共享变量呢?(不单是父->子的方向, 还有子->父的方向)。答案是, 让子作用域"继承"父作用域$scope对象上的某一对象。

    <div ng-controller="parent">
父:{{ model.test }}
<button ng-click="change1();">点我by父亲</button>
<div ng-controller="child">
子:{{ model.test }}
<button ng-click="change2();">点我by儿子</button>
</div>
</div>
    app.controller('parent', ['$scope', function($scope){
$scope.model = {};
$scope.model.test = '父亲';
$scope.change1 = function(){
$scope.model.test = '父亲导致的改变';
}
}]);
app.controller('child', ['$scope', function($scope){
$scope.change2 = function(){
$scope.model.test = '儿子导致的改变';
}
}])

  通讯——在链上传递事件

  下面的这个例子可以说明, 在一个"根"作用域下, 设置了两条"链"(两栋楼)。 实验可见: 楼A的事件传递, 不会被楼B的住户所接受:事件传递是在单链上的。但每条链的链头必定是$rootScope作用域

<body ng-controller="rootController">
<div ng-controller="leftParent">
<div ng-controller="SelfCtrl">
<a ng-click="click();">点我</a>
<div ng-controller="ChildCtrl"></div>
</div>
<div ng-controller="BroCtrl"></div>
</div>
<div ng-controller="rightParent"> </div>
</body>
    app.controller('rootController', ['$scope', function($scope){

    }]);
app.controller('leftParent', ['$scope', function($scope){
$scope.$on('to-parent', function(d,data) {
console.log(data); //父级能得到值
});
$scope.$on('to-child', function(d,data) {
console.log(data); //子级得不到值
});
}]);
app.controller('SelfCtrl', ['$scope', function($scope){
$scope.click = function(){
$scope.$broadcast('to-child', 'child');
$scope.$emit('to-parent', 'parent');
}
}]);
app.controller('ChildCtrl', ['$scope', function($scope){
$scope.$on('to-child', function(d,data) {
console.log(data); //子级能得到值
});
$scope.$on('to-parent', function(d,data) {
console.log(data); //父级得不到值
});
}]);
app.controller('BroCtrl', ['$scope', function($scope){
$scope.$on('to-parent', function(d,data) {
console.log(data); //平级得不到值
});
$scope.$on('to-child', function(d,data) {
console.log(data); //平级得不到值
});
}]); app.controller('rightParent', ['$scope', function($scope){
$scope.$on('to-parent', function(d,data) {
console.log(data); //其它链上不能获取事件
});
$scope.$on('to-child', function(d,data) {
console.log(data); //其它链上不能获取事件
});
}]);

  传递的方向——$broadcast和$emit

  一方面, 如果要提醒一个全局模块, 我们最终需要通知高层次的作用域(如$rootScope), 则需要把事件向上传递($emit)。另一方面, 如果是一个选项卡指令和它的子面板指令之间的通讯, 则把事件向下传递($broadcast)

   $broadcast(name, args){//...}  $emit(name, args)(//...) 其中, name是事件的名称, 而args是参数集合(可以把参数集合到某一$scope对象里, 再把该对象传出)

  事件监听——$on

  当住户知道今天该交水费的时候, 就会安排一个人在家呆着, 等待"收水费"(为某个特定名称的事件注册监听器)的同学来进行配合。要监听事件,我们可以使用$on方法

        $scope.$on('to-parent', function(event,data) {
console.log(data);
});

  其中, event是事件对象,它是事件监听函数的首位参数,它拥有以下几个属性

  1. targetScope(作用域对象) 这个属性是发送或者广播事件的作用域

  2. name 正在处理事件的名称

  3. currentScope 处理当前事件的作用域

  4. stopPropagation(函数) 阻止通过$emit的事件传播进一步往上冒泡

  5. preventDefault(函数) 书上原文是"告诉子作用域无需处理事件", 但实验发现存在问题, 不知道是不是我使用的方法不对。这里举一个阻止默认行为的例子

  例子——锚点的preventDefault

app.directive('a', function() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
if(attrs.ngClick || attrs.href === '' || attrs.href === '#'){
elem.on('click', function(e){
e.preventDefault();
});
}
}
};
});

  6. defaultPrevented(布尔值) 调用preventDefault()会把defaultPrevented设置为true

  事件相关的核心服务

  $emitted事件

$scope.$on('$includeContentLoaded', function(evt){//...})

  1. $includeContentLoaded 该事件在ngInclude的内容重新加载时从ngInclude指令上发出

  2.  $includeContentRequested 每次ngInclude的内容被请求是,它都会被发送

  3.  $viewContentLoaded ngView内容被重新加载时,在当前ngView作用域上发送

  $broadcast事件

  1. $locationChangeStart (注: 事件的触发应该是先location后route事件)

  2. $locationChangeSuccess

  3. $routeChangeStart

  4. $routeChangeSuccess

  5. $routeChangeError

  6. $routeUpdate

  7. $destroy

  

  资料参考

   《AngularJS权威指南》P287

AngularJS中的事件的更多相关文章

  1. Angularjs中的事件广播 —全面解析$broadcast,$emit,$on

    Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传播至子级作用域,包括自己.格 ...

  2. angularjs中阻止事件冒泡,以及指令的注意点

    appModule.directive('newStr',function(){ return{ restrict:'AE', //阻止事件冒泡需要加$event参数 template:`<di ...

  3. AngularJS中的DOM与事件

      前 言 AngularJS中的DOM与事件   AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令.  ng-disabled="true/false" ...

  4. Angularjs 中使用指令绑定点击事件

    项目中,模板中的菜单是jQuery控制的,在Angularjs中就运行不到了,因为菜单项是ng-repeat之后的. 如html <ul id="main-menu"> ...

  5. 关于AngularJs中监听事件及脏循环的理解

    可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...

  6. AngularJS中的指令全面解析(转载)

    说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...

  7. AngularJS中的控制器和作用域

    欢迎大家指导与讨论 : ) 一. 作用域的事件传播 一 . 1 修改的传播   关于作用域最重要的一点是修改会通过事件传播下去,自动更新所以依赖的数据值,即使是通过行为产生的.简而言之,就是即时您只修 ...

  8. AngularJS中实现无限级联动菜单

    多级联动菜单是常见的前端组件,比如省份-城市联动.高校-学院-专业联动等等.场景虽然常见,但仔细分析起来要实现一个通用的无限分级联动菜单却不一定像想象的那么简单.比如,我们需要考虑子菜单的加载是同步的 ...

  9. AngularJS 学习之事件

    1.ng-click指令:定义了AngularJS点击事件 <div ng-app="" ng-controller="myCtrl"> <b ...

随机推荐

  1. ios 各种机型屏幕尺寸大小

  2. QBus 关注并推送实时公交信息

                                            后台服务器定时根据关注列表,查询最近车辆,发送邮件进行推送                

  3. javaScript基础语法(下)

    4.逻辑控制语句 4.1条件结构 条件结构分为if结构和switch结构. 通常在写代码时,您总是需要为不同的决定来执行不同的动作.您可以在代码中使用条件语句来完成该任务. 在 JavaScript ...

  4. php并发编程相关扩展

    Stream:PHP内核提供的socket封装Sockets:对底层Socket API的封装Libevent:对libevent库的封装Event:基于Libevent更高级的封装,提供了面向对象接 ...

  5. 关于RichTextField2.0表情显示错乱的问题!

    flex4.5和4.6在textField.getCharBoundaries()这个方法的返回结果上是不一样的.getCharBoundaries()方法只会返回被渲染出来的文字的边框信息,也就是说 ...

  6. linux监控命令nc用法

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  7. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  8. html5语法

    html5语法沿用html语法,但更简单,更人性化. 一.DOCTYPE及字符编码 DOCTYPE:<!doctype html>或者<!DOCTYPE html>因为html ...

  9. [书目20160526]Brain Rules 让大脑自由:释放天赋的12条定律

    推荐序1 12条定律,让大脑更聪明推荐序2 走过迷雾地带前  言 人人都有一个不可思议的大脑 定律1:越运动,大脑越聪明 信不信,“驴友”比“沙发土豆”更聪明! 老板,请把办公室的咖啡机换成跑步机! ...

  10. 这回真的是挤时间了-PHP基础(三)

    hi 刚看了唐人街探案,5星好评啊亲.由于是早就约好的,也不好推辞(虽然是和男的..),但该写的还是得挤时间写.明天早上老师的项目结题,虽然和我关系不大,但不要添乱就好!! 1.PHP  一.PHP基 ...