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

check for cancel in $broadcast and $dispatch

Evan You 11 лет назад
Родитель
Сommit
0ad97e6b24
1 измененных файлов с 9 добавлено и 3 удалено
  1. 9 3
      src/api/events.js

+ 9 - 3
src/api/events.js

@@ -88,8 +88,10 @@ exports.$emit = function (event) {
     while (i--) {
       args[i] = arguments[i + 1]
     }
-    cbs = _.toArray(cbs)
     i = 0
+    cbs = cbs.length > 1
+      ? _.toArray(cbs)
+      : cbs
     for (var l = cbs.length; i < l; i++) {
       if (cbs[i].apply(this, args) === false) {
         this._eventCancelled = true
@@ -114,7 +116,9 @@ exports.$broadcast = function (event) {
     for (var i = 0, l = children.length; i < l; i++) {
       var child = children[i]
       child.$emit.apply(child, arguments)
-      child.$broadcast.apply(child, arguments)
+      if (!child._eventCancelled) {
+        child.$broadcast.apply(child, arguments)
+      }
     }
   }
 }
@@ -130,6 +134,8 @@ exports.$dispatch = function () {
   var parent = this.$parent
   while (parent) {
     parent.$emit.apply(parent, arguments)
-    parent = parent.$parent
+    parent = parent._eventCancelled
+      ? null
+      : parent.$parent
   }
 }