Page 308 - AngularJS权威教程
P. 308

288  第 20 章  事件


                 另一方面,如果要提醒一个全局模块(为了说),我们最终需要通知高层次的作用域(例如
             $rootScope),并且需要把事件向上传递。


                         限制向全局层面传递通知的数量是个好主意,尤其是因为事件虽然很强大,但
                        增加了系统的复杂度。


                 比如,当我们在做路由的时候,“全局”应用状态需要知道应用当前设置了哪个页面。另一
             方面,如果我们是在一个选项卡指令和它的子面板指令之间通信,就需要把事件向下传。

             20.2.1 使用$emit来冒泡事件

                 要把事件沿着作用域链向上派送(从子作用域到父作用域),我们要使用$emit()函数。

                 // 发送一个事件
                 // 我们的用户以当前user登录了
                 scope.$emit('user:logged_in', scope.user);
                 在一个$emit()事件函数的调用中,事件从子作用域冒泡到父作用域。在产生事件的作用域
             之上的所有作用域都会收到这个事件的通知。
                 当想要跟应用的其他部分交流状态的变更时,我们使用$emit()。如果想要跟$rootScope通
             信,需要$emit()这个事件。

                 $emit()方法带有两个参数。
                 1. name(字符串)

                 要发出的事件名称。
                 2. args(集合)

                 一个参数的集合,作为对象传递到事件监听器中。
                 $emit()方法返回了一个事件对象(关于事件对象的细节,查看20.3节)。

                 从监听器中发出的一切异常都会传递到$exceptionHandler服务中。


             20.2.2 使用$broadcast向下传递事件

                 要把事件向下传递(从父作用域到子作用域),我们使用$broadcast()函数。

                 // 等等,购物车去结账了
                 // 当购物车在结账的时候
                 // 下面所有的指令都应当禁用自己
                 scope.$broadcast('cart:checking_out', scope.cart);

                 在$broadcast()方法上,每个注册了监听器的子作用域都会收到这个信息。事件传播到所
             有的指令和当前作用域的间接作用域上,并且一路往下调用每个监听器。

                 用了$broadcast()方法之后,就没法取消事件的发送了。
                 $broadcast()方法自身带有两个参数。
   303   304   305   306   307   308   309   310   311   312   313