mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-06-16 10:23:51 +08:00
fix(jqLite): triggerHandler support unbind self
Fixes .one if the event is invoked from triggerHandler. Closes #5984
This commit is contained in:
@@ -948,7 +948,9 @@ forEach({
|
||||
clone: jqLiteClone,
|
||||
|
||||
triggerHandler: function(element, eventName, eventData) {
|
||||
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
|
||||
// Copy event handlers in case event handlers array is modified during execution.
|
||||
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
|
||||
eventFnsCopy = shallowCopy(eventFns || []);
|
||||
|
||||
eventData = eventData || [];
|
||||
|
||||
@@ -962,7 +964,7 @@ forEach({
|
||||
stopPropagation: noop
|
||||
}];
|
||||
|
||||
forEach(eventFns, function(fn) {
|
||||
forEach(eventFnsCopy, function(fn) {
|
||||
fn.apply(element, event.concat(eventData));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1743,6 +1743,26 @@ describe('jqLite', function() {
|
||||
event.preventDefault();
|
||||
expect(event.isDefaultPrevented()).toBe(true);
|
||||
});
|
||||
|
||||
|
||||
it('should support handlers that deregister themselves', function() {
|
||||
var element = jqLite('<a>poke</a>'),
|
||||
clickSpy = jasmine.createSpy('click'),
|
||||
clickOnceSpy = jasmine.createSpy('clickOnce').andCallFake(function() {
|
||||
element.off('click', clickOnceSpy);
|
||||
});
|
||||
|
||||
element.on('click', clickOnceSpy);
|
||||
element.on('click', clickSpy);
|
||||
|
||||
element.triggerHandler('click');
|
||||
expect(clickOnceSpy).toHaveBeenCalledOnce();
|
||||
expect(clickSpy).toHaveBeenCalledOnce();
|
||||
|
||||
element.triggerHandler('click');
|
||||
expect(clickOnceSpy).toHaveBeenCalledOnce();
|
||||
expect(clickSpy.callCount).toBe(2);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user