mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-24 03:55:49 +08:00
fix(Scope): allow removing a listener during event
This commit is contained in:
@@ -708,6 +708,74 @@ describe('Scope', function() {
|
||||
});
|
||||
|
||||
|
||||
it('should allow removing event listener inside a listener on $emit', function() {
|
||||
var spy1 = jasmine.createSpy('1st listener');
|
||||
var spy2 = jasmine.createSpy('2nd listener');
|
||||
var spy3 = jasmine.createSpy('3rd listener');
|
||||
|
||||
var remove1 = child.$on('evt', spy1);
|
||||
var remove2 = child.$on('evt', spy2);
|
||||
var remove3 = child.$on('evt', spy3);
|
||||
|
||||
spy1.andCallFake(remove1);
|
||||
|
||||
expect(child.$$listeners['evt'].length).toBe(3);
|
||||
|
||||
// should call all listeners and remove 1st
|
||||
child.$emit('evt');
|
||||
expect(spy1).toHaveBeenCalledOnce();
|
||||
expect(spy2).toHaveBeenCalledOnce();
|
||||
expect(spy3).toHaveBeenCalledOnce();
|
||||
expect(child.$$listeners['evt'].length).toBe(3); // cleanup will happen on next $emit
|
||||
|
||||
spy1.reset();
|
||||
spy2.reset();
|
||||
spy3.reset();
|
||||
|
||||
// should call only 2nd because 1st was already removed and 2nd removes 3rd
|
||||
spy2.andCallFake(remove3);
|
||||
child.$emit('evt');
|
||||
expect(spy1).not.toHaveBeenCalled();
|
||||
expect(spy2).toHaveBeenCalledOnce();
|
||||
expect(spy3).not.toHaveBeenCalled();
|
||||
expect(child.$$listeners['evt'].length).toBe(1);
|
||||
});
|
||||
|
||||
|
||||
it('should allow removing event listener inside a listener on $broadcast', function() {
|
||||
var spy1 = jasmine.createSpy('1st listener');
|
||||
var spy2 = jasmine.createSpy('2nd listener');
|
||||
var spy3 = jasmine.createSpy('3rd listener');
|
||||
|
||||
var remove1 = child.$on('evt', spy1);
|
||||
var remove2 = child.$on('evt', spy2);
|
||||
var remove3 = child.$on('evt', spy3);
|
||||
|
||||
spy1.andCallFake(remove1);
|
||||
|
||||
expect(child.$$listeners['evt'].length).toBe(3);
|
||||
|
||||
// should call all listeners and remove 1st
|
||||
child.$broadcast('evt');
|
||||
expect(spy1).toHaveBeenCalledOnce();
|
||||
expect(spy2).toHaveBeenCalledOnce();
|
||||
expect(spy3).toHaveBeenCalledOnce();
|
||||
expect(child.$$listeners['evt'].length).toBe(3); //cleanup will happen on next $broadcast
|
||||
|
||||
spy1.reset();
|
||||
spy2.reset();
|
||||
spy3.reset();
|
||||
|
||||
// should call only 2nd because 1st was already removed and 2nd removes 3rd
|
||||
spy2.andCallFake(remove3);
|
||||
child.$broadcast('evt');
|
||||
expect(spy1).not.toHaveBeenCalled();
|
||||
expect(spy2).toHaveBeenCalledOnce();
|
||||
expect(spy3).not.toHaveBeenCalled();
|
||||
expect(child.$$listeners['evt'].length).toBe(1);
|
||||
});
|
||||
|
||||
|
||||
describe('event object', function() {
|
||||
it('should have methods/properties', function() {
|
||||
var event;
|
||||
|
||||
Reference in New Issue
Block a user