AngularJS $on $broadcast $emit

如何在作用域之间通信呢?
    1.创建一个单例服务,然后通过这个服务处理所有子作用域的通信。
    2.通过作用域中的事件处理通信。但是这种方法有一些限制;例如,你并不能广泛的将事件传播到所有监控的作用域中。你必须选择是否与父级作用域或者子作用域通信。

$on、$emit和$broadcast使得event、data在controller之间的传递变的简单。

$broadcast、$emit事件必须依靠其他事件(ng-click等)进行触发,而不能单纯写一个这个。。
$on倒是可以直接写,因为它属于监听和接收数据的。

$emit只能向parent controller传递event与data
$broadcast只能向child controller传递event与data
$on用于接收event与data

举例:

html代码

<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>

js代码

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);          //平级得不到值  
  });  
});

$emit和$broadcast可以传多个参数,$on也可以接收多个参数。

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

时间: 2024-10-05 03:23:01

AngularJS $on $broadcast $emit的相关文章

angularjs的$on、$emit、$broadcast

如何在作用域之间通信呢? 1.创建一个单例服务,然后通过这个服务处理所有子作用域的通信. 2.通过作用域中的事件处理通信.但是这种方法有一些限制:例如,你并不能广泛的将事件传播到所有监控的作用域中.你必须选择是否与父级作用域或者子作用域通信. $on.$emit和$broadcast使得event.data在controller之间的传递变的简单.$emit:子传父 传递event与data$broadcast:父传子 child controller传递event与data$on:监听或接收数

angularJs--$on、$emit和$broadcast的使用

$emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 例子如下 html代码 <div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller="SelfCtrl"> <!--自己--> <a ng-click=&q

AngularJS的学习 $on、$emit和$broadcast的使用

$on.$emit和$broadcast使得event.data在controller之间的传递变的简单. $emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 请看博客:http://www.it165.net/pro/html/201404/12610.html

AngularJS 事件$emit 和$broadcast

页面之间信息传递(子页面->父页面), $emit冒泡事件. 要把事件沿着作用域链向上派送(从子作用域到父作用域),我们要使用$emit()函数 在一个 $emit()事件函数的调用中,事件从子作用域冒泡到父作用域.在产生事件的作用域 之上的所有作用域都会收到这个事件的通知. 当想要跟应用的其他部分交流状态的变更时,我们使用$emit().如果想要跟$rootScope通信,需要$emit()这个事件. $emit()方法带有两个参数. 1.name(字符串)要发出的事件名称. 2.args(集

angularjs中的事件传播$emit,$broadcast,$on

在这里写的技术点 一部分参考AngularJs权威教程一部分参考的是其它的博主的知识点 事件 :如同浏览器响应浏览器层的事件,比如鼠标点击.页面滚动那样,Angular应用也可以响应Angular事件.       这使我们在我们应用中嵌套各组件之间进行通信,即使这些组件在创建的时候并未考虑其他组件.我们可以认为事件是在应用中传播的事件信息片段,通常包含应用中发生的事件信息 注意: AnjularJs事件系统并不与浏览器中的事件系统相通,这意问着我们只能在作用域上监听Angular事件而不是在D

Angular中Controller之间的信息传递(第二种办法):$emit,$broadcast,$on

此处不做详细讲解,提供一个小例子,看了便懂 <html ng-app=""> <div ng-controller="ctrlController"> <div ng-controller="ctrl1Controller"></div> <div ng-controller="ctrl2Controller"></div> </div> &l

$on、$emit和$broadcast的使用

$emit只能向parent controller传递event与data( $emit(name, args) ) $broadcast只能向child controller传递event与data( $broadcast(name, args) ) $on用于接收event与data( $on(name, listener) ) <div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller=

dispatch emit broadcast

1.broadcast 事件广播 遍历寻找所有子孙组件,假如子孙组件和componentName组件名称相同的话,则触发$emit的事件方法,数据为 params. 如果没有找到 则使用递归的方式 继续查找孙组件,直到找到为止,否则继续递归查找,直到找到最后一个都没有找到为止. 2.dispatch 查找所有父级,直到找到要找到的父组件,并在身上触发指定的事件. @param { componentName } 组件名称 @param { eventName } 事件名 @param { par

angular之$on、$emit、$broadcast

1.$scope.$on view事件 //View被加载但是DOM树构建之前时: $scope.$on('$viewContentLoading', function(event, viewConfig){ ... }); //View被加载而且DOM树构建完成时: $scope.$on('$viewContentLoaded', function(event){ ... }); //路由路径发生改变时 current:要到达的路径  previous:上一个路径 $scope.$on('$l

angularJS 系列(六)---$emit(), $on(), $broadcast()的使用

下面以一个例子来讲述 angular 中的event system,有$emit(), $on(), $broadcast().效果图如下 下面的代码中,用到了 controller AS 的语法,具体这种语法的使用情况,好处或是与 原来 直接在 Controller中把视图对象直接绑定到 $scope 对象上面的区别, 可以查看我之前的一片博文. 直接贴代码 <!DOCTYPE html> <html> <head> <link rel="styles