devdocs/assets/javascripts/views/view.coffee
2013-10-24 20:49:33 +02:00

161 lines
3.4 KiB
CoffeeScript

class app.View
$.extend @prototype, Events
constructor: ->
@setupElement()
@originalClassName = @el.className if @el.className
@resetClass() if @constructor.className
@refreshElements()
@init?()
@refreshElements()
setupElement: ->
@el ?= if typeof @constructor.el is 'string'
$ @constructor.el
else if @constructor.el
@constructor.el
else
document.createElement @constructor.tagName or 'div'
return
refreshElements: ->
if @constructor.elements
@[name] = @find selector for name, selector of @constructor.elements
return
addClass: (name) ->
@el.classList.add(name)
return
removeClass: (name) ->
@el.classList.remove(name)
return
resetClass: ->
@el.className = @originalClassName or ''
if @constructor.className
@addClass name for name in @constructor.className.split ' '
return
find: (selector) ->
$ selector, @el
findAll: (selector) ->
$$ selector, @el
findByClass: (name) ->
@findAllByClass(name)[0]
findLastByClass: (name) ->
all = @findAllByClass(name)[0]
all[all.length - 1]
findAllByClass: (name) ->
@el.getElementsByClassName(name)
findByTag: (tag) ->
@findAllByTag(tag)[0]
findLastByTag: (tag) ->
all = @findAllByTag(tag)
all[all.length - 1]
findAllByTag: (tag) ->
@el.getElementsByTagName(tag)
append: (value) ->
$.append @el, value.el or value
return
appendTo: (value) ->
$.append value.el or value, @el
return
prepend: (value) ->
$.prepend @el, value.el or value
return
prependTo: (value) ->
$.prepend value.el or value, @el
return
before: (value) ->
$.before @el, value.el or value
return
after: (value) ->
$.after @el, value.el or value
return
remove: (value) ->
$.remove value.el or value
return
empty: ->
$.empty @el
@refreshElements()
return
html: (value) ->
@empty()
@append value
return
tmpl: (args...) ->
app.templates.render(args...)
delay: (fn, args...) ->
delay = if typeof args[args.length - 1] is 'number' then args.pop() else 0
setTimeout fn.bind(@, args...), delay
onDOM: (event, callback) ->
$.on @el, event, callback
return
offDOM: (event, callback) ->
$.off @el, event, callback
return
bindEvents: ->
if @constructor.events
@onDOM name, @[method] for name, method of @constructor.events
if @constructor.routes
app.router.on name, @[method] for name, method of @constructor.routes
if @constructor.shortcuts
app.shortcuts.on name, @[method] for name, method of @constructor.shortcuts
return
unbindEvents: ->
if @constructor.events
@offDOM name, @[method] for name, method of @constructor.events
if @constructor.routes
app.router.off name, @[method] for name, method of @constructor.routes
if @constructor.shortcuts
app.shortcuts.off name, @[method] for name, method of @constructor.shortcuts
return
addSubview: (view) ->
(@subviews or= []).push(view)
activate: ->
return if @activated
@bindEvents()
view.activate() for view in @subviews if @subviews
@activated = true
true
deactivate: ->
return unless @activated
@unbindEvents()
view.deactivate() for view in @subviews if @subviews
@activated = false
true
detach: ->
@deactivate()
$.remove @el
return