ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 作用域事件的传播 在Angular中,作用域间有非常清晰的层次结构关系,类似于DOM树状图形,最顶层的就是rootscope作用域,其余的都是在它基础之上进行分支和嵌套的。在这种关系下的作用域,它们之间的数据通信变得相对复杂,概括来说,有下列两种方式可以实现作用域的通信。 * 服务(service)通过在作用域间创建一个单例的服务,由该服务来处理各个作用域间的数据通信 * 事件(event)除使用服务外,还可以通过作用域间的事件进行数据通信,而要使用事件,则必须调用Angular中提供的两个方法$broadcasted和$emitted ## $broadcasted 方法$broadcasted的功能是将事件从父级作用域传播至子级作用域,它的调用格式$broadcast(eventname, data)其中,参数eventname为定义的事件名称,data为事件传播过程中携带的数据信息。 ~~~js $scope.$broadcast('filterStateChangeBroadcast',msg); ~~~ ## $emitted 方法$emitted的功能是将事件从子级作用域传播至父级作用域,它的调用格式如下。 $emitted(eventname, data)各参数的功能与$broadcasted相同。 ~~~js $scope.$emit('filterStateChange', 'xxx'); ~~~ ## $on 此外,除这两个传播事件的方法外,还需要通过调用$on方法,在作用域中监控传播来的事件并获取相应的数据,它的调用格式如下。 ~~~js $scope.$on(eventname, function(event,data){ // 接收传播事件的处理代码 }) ~~~ 在上述调用格式中,eventname为需要监控的传播事件名称,event为事件传播过程中自带的特征,该特征包括下列几个重要的属性 * event.targetScope 返回发起传播事件的作用域名称 * event.currentScope 返回正在接收传播事件的作用域名称 * event.name 返回传播时间的名称 * event.stopPropagation() 防止事件冒泡 * event.preventDefault() 阻止代码事件的发生 * event.defaultPrevented当执行了preventDefault方法时,defaultPrevented为true,否则为false 而在$on方法处理传播事件的函数中,另外一个data参数,则为事件在传播过程中携带的数据,通过该对象可以在各个监控的作用域中获取传播时的数据,实现数据通信的功能。虽然说通过作用域的事件可以实现数据通信的功能,但是它们的传播范围非常有限,只能是在父和子级的作用域间进行传播,其他不具有这种关系的作用域将无法监控到传播来的事件。