116 lines
3.2 KiB
CoffeeScript
116 lines
3.2 KiB
CoffeeScript
###
|
|
Crafting Guide - base_controller.coffee
|
|
|
|
Copyright (c) 2014-2015 by Redwood Labs
|
|
All rights reserved.
|
|
###
|
|
|
|
views = require '../views'
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class BaseController extends Backbone.View
|
|
|
|
constructor: (options={})->
|
|
Object.defineProperty this, 'model', get:@getModel, set:@setModel
|
|
|
|
@_model = null
|
|
@_rendered = false
|
|
@_parent = options.parent
|
|
@_children = []
|
|
|
|
Object.defineProperty this, 'rendered', get:-> return @_rendered
|
|
@_loadTemplate options.templateName
|
|
super options
|
|
|
|
# Public Methods ###############################################################################
|
|
|
|
addChild: (Controller, atSelector, options={})->
|
|
options.el = @$(atSelector)[0]
|
|
options.parent = this
|
|
|
|
child = new Controller options
|
|
child.render()
|
|
@_children.push child
|
|
return child
|
|
|
|
refresh: ->
|
|
logger.verbose "#{this} refreshing"
|
|
|
|
# Event Methods ################################################################################
|
|
|
|
onDidModelChange: ->
|
|
@_tryRefresh()
|
|
|
|
onDidModelSync: ->
|
|
@_tryRefresh()
|
|
|
|
onWillRender: -> # do nothing
|
|
|
|
onDidRender: ->
|
|
@_tryRefresh()
|
|
|
|
onWillShow: -> # do nothing
|
|
|
|
onDidShow: -> # do nothing
|
|
|
|
onWillChangeModel: (oldModel, newModel)->
|
|
if oldModel?.on?
|
|
@stopListening oldModel
|
|
if newModel?.on?
|
|
@listenTo newModel, 'sync', (e)=> @onDidModelSync e
|
|
@listenTo newModel, 'change', (e)=> @onDidModelChange e
|
|
return true
|
|
|
|
# Property Methods #############################################################################
|
|
|
|
getModel: ->
|
|
return @_model
|
|
|
|
setModel: (newModel)->
|
|
return if @model is newModel
|
|
return unless @onWillChangeModel @_model, newModel
|
|
|
|
@_model = newModel
|
|
@_tryRefresh()
|
|
|
|
# Backbone.View Overrides ######################################################################
|
|
|
|
render: (options={})->
|
|
return this unless not @_rendered or options.force
|
|
|
|
data = (@model?.toHash? and @model.toHash()) or @model or {}
|
|
|
|
if not @_template?
|
|
logger.error "Default render called for #{@constructor.name} without a template"
|
|
return this
|
|
|
|
logger.verbose "#{this} rendering with data: #{data}"
|
|
@onWillRender()
|
|
$oldEl = @$el
|
|
$newEl = Backbone.$(@_template(data))
|
|
if $oldEl
|
|
$oldEl.replaceWith $newEl
|
|
$newEl.addClass $oldEl.attr 'class'
|
|
|
|
@setElement $newEl
|
|
@_rendered = true
|
|
@onDidRender()
|
|
|
|
return this
|
|
|
|
# Object Overrides #############################################################################
|
|
|
|
toString: ->
|
|
return "#{@constructor.name}(#{@cid})"
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_loadTemplate: (templateName)->
|
|
if templateName?
|
|
@_template = views[templateName]
|
|
|
|
_tryRefresh: ->
|
|
return unless @_rendered
|
|
@refresh()
|