Backbone Template
by jscheel
HTML
<script src="https://raw.github.com/appendto/jquery-mockjax/master/jquery.mockjax.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-git.css">
<script src="http://code.jquery.com/qunit/qunit-git.js"></script>
<script src="http://backbonejs.org/backbone.js"></script>
<h1 id="qunit-header">Unit Tests</h1>
<h2 id="qunit-banner"></h2>
<div id="qunit-testrunner-toolbar"></div>
<ol id="qunit-tests"></ol>
<div id="qunit-fixture"></div>
CoffeeScript
mockData = [
{id: 0, title: 'asset 1', region: 1}
{id: 1, title: 'asset 2', region: 1}
{id: 2, title: 'asset 3', region: 2}
]
$.mockjax (settings) ->
settings.url == '/restful/assets'
id = settings.url.match(///
/restful/assets/(.*)$
///)
if id?[1]?
asset = _.find mockData, (asset) ->
asset.id == parseInt id[1]
return {responseText: asset}
return {responseText: mockData}
nestCollection = (model, attributeName, nestedCollection) ->
i = 0
while i < nestedCollection.length
model.attributes[attributeName][i] = nestedCollection.at(i).attributes
i++
nestedCollection.bind "add", (initiative) ->
model.attributes[attributeName] = [] unless model.get(attributeName)
model.get(attributeName).push initiative.attributes
nestedCollection.bind "remove", (initiative) ->
updateObj = {}
updateObj[attributeName] = _.without(model.get(attributeName), initiative.attributes)
model.set updateObj
nestedCollection
class AssetsView extends Backbone.View
_subCollections: {}
_subCollectionViews: {}
initialize: ->
@.collection.on 'reset', @addAll, @
@.collection.on 'add', @addOne
@.collection.on 'remove', @removeOne
addAll: ->
@collection.each (asset) =>
@addOne asset
addOne: (asset, collection, options = {}) =>
region = asset.get('region')
if not @_subCollections[region]?
@_subCollections[region] = new Backbone.Collection
@_subCollectionViews[region] = new RegionView(collection: @_subCollections[region])
@_subCollections[region].add asset, {silent: true}
class RegionView extends Backbone.View
initialize: ->
@.collection.on 'reset', @addAll, @
@.collection.on 'add', @addOne
@.collection.on 'remove', @removeOne
...