mirror of https://github.com/freeCodeCamp/devdocs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
3.4 KiB
162 lines
3.4 KiB
11 years ago
|
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
|