Handle .stopImmediatePropagation() being called on command events

This commit is contained in:
Nathan Sobo
2014-09-05 09:12:42 -06:00
parent fbaf956e1f
commit fe27ebec1b
2 changed files with 17 additions and 1 deletions

View File

@@ -67,3 +67,13 @@ describe "CommandRegistry", ->
grandchild.dispatchEvent(new CustomEvent('command', bubbles: true))
expect(calls).toEqual ['child-1', 'child-2']
it "stops invoking callbacks when .stopImmediatePropagation() is called on the event", ->
calls = []
registry.add 'command', '.parent', -> calls.push('parent')
registry.add 'command', '.child', -> calls.push('child-2')
registry.add 'command', '.child', (event) -> calls.push('child-1'); event.stopImmediatePropagation()
grandchild.dispatchEvent(new CustomEvent('command', bubbles: true))
expect(calls).toEqual ['child-1']

View File

@@ -17,12 +17,17 @@ class CommandRegistry
dispatchCommand: (event) =>
propagationStopped = false
immediatePropagationStopped = false
currentTarget = event.target
syntheticEvent = Object.create event,
eventPhase: value: Event.BUBBLING_PHASE
currentTarget: get: -> currentTarget
stopPropagation: value: -> propagationStopped = true
stopPropagation: value: ->
propagationStopped = true
stopImmediatePropagation: value: ->
propagationStopped = true
immediatePropagationStopped = true
loop
matchingListeners =
@@ -31,6 +36,7 @@ class CommandRegistry
.sort (a, b) -> a.compare(b)
for listener in matchingListeners
break if immediatePropagationStopped
listener.callback.call(currentTarget, syntheticEvent)
break if propagationStopped