angularJS 事件广播与接收[转]

angularJS 事件广播与接收[转]

 

路由的事件

    事件这个词在前端出现的频率真是高,根本拦不住,哪都是.$route服务在路由过程中的每个阶段都会触发不同的事件,可以为这些不同的路由事件设置监听器并做出响应.

    一共有4个事件用来监听路由的状态变化: $routeStartChange, $routeChangeSuccess, $routeChangeError, $routeUpdate.

    其中最常用的是前两个,这里稍微解释一下.

    (1) $routeStartChange

    看名字就能猜出来它表示的是路由开始变化的事件,在浏览器地址栏发生变化之前AngularJS会先广播一下这个事件.路由会开始加载所有需要的依赖,模板和resolve部分的内容也会注入.

1
2
3
4
5
6
angular.module(
'myApp'
, [])
  
.run([
'$rootScope'

'$location'

function
($rootScope, $location){
    
$rootScope.$on(
'$routeChangeStart'

function
(evt, next, current){
    
console.log(
'route begin change'
);
  
}); 
}]);

 

    解释一下事件的参数,evt是事件对象,可以从中读取到一些route的信息.next是将要导航到的路由,current是当前的URL.

    可以看见在这个时期我们可以做很多有用的事,因为此时仅仅是路由开始变化,对应的内容都还没来得及发生改变.这里我们可进行permission的校验,loading画面的加载,对应路由信息的读取等等.

    (2) $routeChangeSuccess

    在路由的所有依赖都被注入加载后,AngularJS会对外广播路由跳转成功的事件.

1
2
3
4
5
6
angular.module(
'myApp'
, [])
  
.run([
'$rootScope'

'$location'

function
($rootScope, $location) {
    
$rootScope.$on(
'$routeChangeSuccess'

function
(evt, current, previous) {
      
console.log(
'route have already changed'
);
    
}); 
}])

 

    这里也稍微解释下三个参数,evt是AngularJS事件对象,current是当前所处路由,previous是上一个路由.

    剩下两个不太常用的事件,大家去看官方API说明吧,这里不介绍了

———————————————————————-

  • $emit只能向parent controller传递event与data( $emit(name, args) )
  • $broadcast只能向child controller传递event与data( $broadcast(name, args) )
  • $on用于接收event与data( $on(name, listener) )
click me

 

 

本节课程源码:

1
2
3
4
5
6
7
8
9
10
     
<
div
ng-controller
=
"ParentCtrl"
>             
<!--父级-->
  
<
div
ng-controller
=
"SelfCtrl"
>             
<!--自己-->
    
<
a
ng-click
=
"click()"
>click me</
a
>
    
<
div
ng-controller
=
"ChildCtrl"
></
div
>    
<!--子级-->
  
</
div
>
  
<
div
ng-controller
=
"BroCtrl"
></
div
>        
<!--平级-->
</
div
>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var
app = angular.module(
'myApp'
, []);
app.controller(
'SelfCtrl'
,
function
($scope) {
  
$scope.click =
function
() {
    
$scope.$broadcast(
'to-child'
,
'child'
);
    
$scope.$emit(
'to-parent'
,
'parent'
);
  
}
});
 
app.controller(
'ParentCtrl'
,
function
($scope) {
  
$scope.$on(
'to-parent'
,
function
(event,data) {
    
console.log(
'ParentCtrl'
, data);      
//父级能得到值
  
});
  
$scope.$on(
'to-child'
,
function
(event,data) {
    
console.log(
'ParentCtrl'
, data);      
//子级得不到值
  
});
});
 
app.controller(
'ChildCtrl'
,
function
($scope){
  
$scope.$on(
'to-child'
,
function
(event,data) {
    
console.log(
'ChildCtrl'
, data);     
//子级能得到值
  
});
  
$scope.$on(
'to-parent'
,
function
(event,data) {
    
console.log(
'ChildCtrl'
, data);     
//父级得不到值
  
});
});
 
app.controller(
'BroCtrl'
,
function
($scope){
  
$scope.$on(
'to-parent'
,
function
(event,data) {
    
console.log(
'BroCtrl'
, data);        
//平级得不到值
  
});
  
$scope.$on(
'to-child'
,
function
(event,data) {
    
console.log(
'BroCtrl'
, data);        
//平级得不到值
  
});
});

在$on的方法中的event事件参数,其对象的属性和方法如下

事件属性 目的
event.targetScope 发出或者传播原始事件的作用域
event.currentScope 目前正在处理的事件的作用域
event.name 事件名称
event.stopPropagation() 一个防止事件进一步传播(冒泡/捕获)的函数(这只适用于使用`$emit`发出的事件)
event.preventDefault() 这个方法实际上不会做什么事,但是会设置`defaultPrevented`为true。直到事件监听器的实现者采取行动之前它才会检查`defaultPrevented`的值。
event.defaultPrevented 如果调用了`preventDefault`则为true

———————————————————-

 

父传($scope.$broadcast)子接收($scope.$on)
angular.module('myApp', [])
.controller('ParentCtrl', ['$scope', function($scope) {

$scope.message = "Child updated from parent controller";

$scope.clickFunction = function() {

$scope.$broadcast(‘update_parent_controller’, $scope.message);
};
}
])
.controller(‘ChildCtrl’, [‘$scope’, function($scope) {

$scope.message = “Some text in child controller”;

$scope.$on("update_parent_controller", function(event, message) {

$scope.message = message;
});
}
]);

Here a plunker for a live demo.

Instead, if it need to send data from the SecondController (child) to the FirstController (parent), it should use the $emit method.
Here the javascript code:
子传($scope.$emit)父接收($scope.$on)
angular.module('myApp', [])
.controller('ParentCtrl', ['$scope', function ($scope) {

$scope.message = "Some text in parent";
$scope.$on("update_parent_controller", function(event, message){

$scope.message = message;
});

}])
.controller(‘ChildCtrl’, [‘$scope’, function ($scope) {

$scope.clickFunction = function() {

$scope.message = “Parent updated”;

$scope.$emit(‘update_parent_controller’, $scope.message);
}

}]);

Here a plunker for a live demo.

Finally, here a little trick where two controller have no parent/child relationship.
It should pass data from one controller through $rootScope and the $broadcast method.
Here the javascript code:
兄弟传($rootScope.$broadcast)兄弟接收($rootScope.$on)
angular.module('myApp', [])
.controller('FirstCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {

$scope.message = "Clicked!";

$rootScope.clickFunction = function() {

$rootScope.$broadcast(“Update”, $scope.message);
};
}])
.controller(‘SecondCtrl’, [‘$scope’,’$rootScope’, function($scope,$rootScope) {

$scope.message = “Waiting for a click…”;

$rootScope.$on("Update", function(event, message) {

$scope.message = message;
});
}]);

Here a plunker for a live demo.

 

———————————————————————————-

 

 

 

 

发送消息: $scope.$emit(name, data) 或者 $scope.$broadcast(name, data);

接收消息: $scope.on(name,function(event,data){ });

区别: $emit 广播给父controller   $broadcast 广播给子controller

 

broadcast 是从发送者向他的子scope广播一个事件。

这里就是ParentController发送, ParentController 和 ChildController 会接受到, 而MainController是不会收到的

 

$emit 广播给父controller,父controller 是可以收到消息

$on 有两个参数function(event,msg)  第一个参数是事件对象,第二个参数是接收到消息信息

 

复制代码
var app = angular.module('onBroadcastEvent', ['ng']);

app.controller('MainController', function($scope) {
    $scope.$on('To-MainController', function(event,msg) {
        console.log('MainController received:' + msg);
    });
});

app.controller('ParentController', function($scope) {
    $scope.click = function (msg) {
        $scope.$emit('To-MainController',msg + ',from ParentController to MainController');
        $scope.$broadcast('To-ChildController', msg + ',from ParentController to ChildController');
        $scope.$broadcast('To-BrotherController', msg + ',from ParentController to BrotherController');
    }
});

app.controller('ChildController', function($scope){
    $scope.$on('To-ChildController', function(event,msg) {
        console.log('ChildController received:' + msg);
    });
});

app.controller('BrotherController', function($scope){
    $scope.$on('To-BrotherController', function(event, msg) {
        console.log('BrotherController received:' + msg);
    });
});
复制代码
 
 

转载于:https://www.cnblogs.com/fx2008/p/5435575.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109055.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Vue响应式实现原理[通俗易懂]

    Vue响应式实现原理[通俗易懂]Vue响应式原理Vue是数据驱动视图实现双向绑定的一种前端框架,采用的是非入侵性的响应式系统,不需要采用新的语法(扩展语法或者新的数据结构)实现对象(model)和视图(view)的自动更新,数据层(Model)仅仅是普通的Javascript对象,当Modle更新后view层自动完成更新,同理view层修改会导致model层数据更新。双向绑定实现机制Vue的双向绑定实现机制核心:依赖于Object.defineProperty()实现数据劫持订阅模式Object.defineProper

  • Zencart模板结构和设计详解[通俗易懂]

    Zencart模板结构和设计详解[通俗易懂]
    ZenCart的设计很简单,和其他HTML页面是一样的。只是整个页面分成了几个部分,并加入了PHP代码。
    通常分为页眉(header),页脚(footer),边框(sideboxes)。页面通过CSS样式表来控制,样式表控制了包括表格单元的背景图案、字体颜色和样式等等,所以假如你需要修改边框标题栏的字体,那么就去查看样式表文件。
    ZenCart在页面添加图像有两种方式。可以使用图像目录的相对路径,或者在模板中用php变量定义图像。如果你使用https服

  • 我的博客创作之路[通俗易懂]

    我的博客创作之路[通俗易懂]我的博客创作之路。。在博客的在评论/留言中常看到有朋友在问博客的意义究竟是什么?工作这么忙那有时间写博客、有空休息一下多好……等类似信息,其实我早就想写篇这样的文章了从2008年我写博客到现在,每周都会做工作笔记,从没间断,有时我会将大家关注的话题以博文的方式在网上发布,即使现在玩微博了,我也依然如此坚持。。。在我的博客上,从分类来看主要分Linux企业应用、教学、网络管理、…

  • web.config connectionStrings[通俗易懂]

    web.config connectionStrings[通俗易懂] web.configconnectionStrings数据库连接字符串的解释先来看一下默认的连接SQLServer数据库配置  SqlConnectionStringBuilder实例化时需要使用connectionString。如:SqlConnectionStringBuildbuilder=newSqlConnectionStringBuild(connection

  • python中字符串转成数字的几种方法[通俗易懂]

    python中字符串转成数字的几种方法[通俗易懂]在python列表操作中,面对需要把列表中的字符串转为礼拜的操作,无需强转,通过简单的几步就可以实现,本文介绍python中字符串转成数字的三种方法:1、使用join的方法;2、使用int函数将16进制字符串转化为10进制整数;3、使用列表生成式进行转换。方法一:使用join的方法num_list=[‘1′,’2′,’3’]str_list=”.join(num_str)#把列表中的元素连起来print(int(str_list))输出123方法二:使用int函数将16进制

    2022年10月22日
  • Linux内核移植_rom内核移植

    Linux内核移植_rom内核移植这两天在友善的tiny210的实验板上移植了linux内核,正好和大家分享,同时也算是做个记录吧!首先介绍一下开发环境吧,这个在做移植的时候还是挺重要的。主机linux:Fedora9 安装在VMware虚拟机上;开发板 :友善的tiny210,256M的FLASH;移植linux:LINUX-3.3.5;交叉编译环境:arm-linux-gcc-4.4.3这个是友善24

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号