Skip to content

Instantly share code, notes, and snippets.

@alexkirsz
Created April 21, 2014 00:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexkirsz/11129320 to your computer and use it in GitHub Desktop.
Save alexkirsz/11129320 to your computer and use it in GitHub Desktop.
A mixin that transforms react components into event emitters and receivers
isEventComponent = (component) ->
component._listeners?
findNearestEventComponent = (component) ->
if (isEventComponent component)
component
else if component._owner
findNearestEventComponent component._owner
else
null
createEvent = (name, args) ->
event =
name: name
args: args
stopped: false
stopPropagation: ->
@stopped = true
module.exports =
componentWillMount: ->
@_listeners = {}
bubble: (name, args...) ->
event = createEvent name, args
@_dispatch event
emit: (name, args...) ->
event = createEvent name, args
@_trigger event
_dispatch: (event) ->
@_trigger event
return if event.stopped or not @_owner?
component = findNearestEventComponent @_owner
component._dispatch event if component
_trigger: (event) ->
listeners = @_listeners[event.name]
if listeners
listener event for listener in listeners
on: (event, listener) ->
@_listeners[event] or= []
@_listeners[event].push listener
off: (event, listener) ->
if listener
@_listeners[event].splice (@_listeners.indexOf listener), 1
else
delete @_listeners[event]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment