fix(rootScope): make stopPropagation only stop its own event

All sibling event handlers residing on the same scope to were stopped
if one of them called stopPropagation.

Closes #4204
This commit is contained in:
Pete Bacon Darwin 2013-10-05 22:45:43 +01:00
parent 9089468092
commit 47f7bd706e
2 changed files with 11 additions and 1 deletions

View file

@ -867,12 +867,14 @@ function $RootScopeProvider(){
continue;
}
try {
//allow all listeners attached to the current scope to run
namedListeners[i].apply(null, listenerArgs);
if (stopPropagation) return event;
} catch (e) {
$exceptionHandler(e);
}
}
//if any listener on the current scope stops propagation, prevent bubbling
if (stopPropagation) return event;
//traverse upwards
scope = scope.$parent;
} while (scope);

View file

@ -1060,6 +1060,14 @@ describe('Scope', function() {
expect(log).toEqual('2>1>0>');
});
it('should allow all events on the same scope to run even if stopPropagation is called', function(){
child.$on('myEvent', logger);
grandChild.$on('myEvent', function(e) { e.stopPropagation(); });
grandChild.$on('myEvent', logger);
grandChild.$on('myEvent', logger);
grandChild.$emit('myEvent');
expect(log).toEqual('2>2>2>');
});
it('should dispatch exceptions to the $exceptionHandler',
inject(function($exceptionHandler) {