travis-web/app/mixins/polling.coffee
Piotr Sarnacki a4a75912b0 Implement ajax polling for things that are visible on the screen
We sometimes miss pusher updates, which started to be more common
lately. Until we investigate what's going on, this should be a good
workaround for keeping UI in sync with the DB.
2015-05-07 13:49:21 +02:00

64 lines
1.4 KiB
CoffeeScript

`import Ember from 'ember'`
mixin = Ember.Mixin.create
polling: Ember.inject.service()
didInsertElement: ->
@_super.apply(this, arguments)
@startPolling()
willDestroyElement: ->
@_super.apply(this, arguments)
@stopPolling()
willDestroy: ->
@_super.apply(this, arguments)
@stopPolling()
pollModelDidChange: (sender, key, value) ->
@pollModel(key)
pollModelWillChange: (sender, key, value) ->
@stopPollingModel(key)
pollModel: (property) ->
model = @get(property)
@get('polling').startPolling(model)
stopPollingModel: (property) ->
model = @get(property)
@get('polling').stopPolling(model)
startPolling: ->
pollModels = @get('pollModels')
if pollModels
pollModels = [pollModels] unless pollModels.forEeach
pollModels.forEach (property) =>
@pollModel(property)
@addObserver(property, this, 'pollModelDidChange')
Ember.addBeforeObserver(this, property, this, 'pollModelWillChange')
@get('polling').startPollingHook(this) if @pollHook
stopPolling: ->
pollModels = @get('pollModels')
return unless pollModels
pollModels = [pollModels] unless pollModels.forEeach
pollModels.forEach (property) =>
@stopPollingModel(property)
@removeObserver(property, this, 'pollModelDidChange')
Ember.removeBeforeObserver(this, property, this, 'pollModelWillChange')
@get('polling').stopPollingHook(this)
`export default mixin`