From e84f309869f43a35ed6dc61c3c794b4f7fc666ed Mon Sep 17 00:00:00 2001 From: Kaspars Date: Sat, 28 Nov 2015 11:10:22 +0200 Subject: [PATCH] fixes #13401 the $emit loop is not aware which listener was removed --- src/ng/rootScope.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 3658d376e0a1..f9377bc95b12 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -1175,6 +1175,7 @@ function $RootScopeProvider() { $emit: function(name, args) { var empty = [], namedListeners, + namedListenersCopy, scope = this, stopPropagation = false, event = { @@ -1191,19 +1192,20 @@ function $RootScopeProvider() { do { namedListeners = scope.$$listeners[name] || empty; + namedListenersCopy = namedListeners.slice(0); event.currentScope = scope; for (i = 0, length = namedListeners.length; i < length; i++) { // if listeners were deregistered, defragment the array - if (!namedListeners[i]) { - namedListeners.splice(i, 1); + if (namedListeners.indexOf(namedListenersCopy[i]) === -1) { + namedListenersCopy.splice(i, 1); i--; length--; continue; } try { //allow all listeners attached to the current scope to run - namedListeners[i].apply(null, listenerArgs); + namedListenersCopy[i].apply(null, listenerArgs); } catch (e) { $exceptionHandler(e); }