Просмотр исходного кода

allow return false in event handlers to cancel propagation/broadcasting

Evan You 11 лет назад
Родитель
Сommit
04dd3af0a1
2 измененных файлов с 18 добавлено и 20 удалено
  1. 13 19
      src/api/events.js
  2. 5 1
      src/emitter.js

+ 13 - 19
src/api/events.js

@@ -22,17 +22,14 @@
  */
 
 exports.$broadcast = function () {
-  var children = this.children
+  var children = this._children
   for (var i = 0, l = children.length; i < l; i++) {
     var child = children[i]
-    child._emitter.applyEmit.apply(
-      child._emitter,
-      arguments
-    )
-    child.$broadcast.apply(
-      child,
-      arguments
-    )
+    var emitter = child._emitter
+    emitter.applyEmit.apply(emitter, arguments)
+    if (!emitter._cancelled) {
+      child.$broadcast.apply(child, arguments)
+    }
   }
 }
 
@@ -44,15 +41,12 @@ exports.$broadcast = function () {
  */
 
 exports.$dispatch = function () {
-  this._emitter.applyEmit.apply(
-    this._emitter,
-    arguments
-  )
-  var parent = this.$parent
-  if (parent) {
-    parent.$dispatch.apply(
-      parent,
-      arguments
-    )
+  var emitter = this._emitter
+  emitter.applyEmit.apply(emitter, arguments)
+  if (!emitter._cancelled) {
+    var parent = this.$parent
+    if (parent) {
+      parent.$dispatch.apply(parent, arguments)
+    }
   }
 }

+ 5 - 1
src/emitter.js

@@ -8,6 +8,7 @@ var _ = require('./util')
  */
 
 function Emitter (ctx) {
+  this._cancelled = false
   this._ctx = ctx || this
 }
 
@@ -114,6 +115,7 @@ p.emit = function (event, a, b, c) {
  */
 
 p.applyEmit = function (event) {
+  this._cancelled = false
   this._cbs = this._cbs || {}
   var callbacks = this._cbs[event]
   if (callbacks) {
@@ -127,7 +129,9 @@ p.applyEmit = function (event) {
     }
     callbacks = _.toArray(callbacks)
     for (i = 0, l = callbacks.length; i < l; i++) {
-      callbacks[i].apply(this._ctx, args)
+      if (callbacks[i].apply(this._ctx, args) === false) {
+        this._cancelled = true
+      }
     }
   }
   return this