Want to see the full-length video right now for free?
If we didn't have Backbone in order to retrieve our list of notes we would have to use some code similar to the following
var notes
notesPromise = $.ajax('/notes.json')
noteFactory = function(data) { return new App.Models.Note(data) }
notesPromise.done(function(data) { notes = _.map(data, noteFactory) })
notes
Luckily, Backbone provides some plumbing to do the heavy lifting of this for us in the form of Collections object.
Create a Collections.Notes class, with a url and model property
class App.Collections.Notes extends Backbone.Collection
url: '/notes'
model: App.Models.Note
Now that we've created our Notes Backbone collection let's use it in our application initializer
Wrap the rest of initialize in a success callback to fetch since the
collection is loading asynchronously
window.ScratchPad = Models: {} Collections: {} Views: {} Routers: {} initialize: -> @AllNotes = new @Collections.Notes @AllNotes.fetch().done => new @Routers.ScratchPadRouter Backbone.history.start(pushState: true)
Finally we need to change the loop in our index.jst.eco template to @notes.models
<ul>
<% for note in @notes.models: %>
<li>
<dl>
<dt>Title</dt>
<dd><a href="/notes/<%= note.id %>"><%= note.get('title') %></a></dd>
<dt>Content</dt>
<dd><%= note.get('content') %></dd>
</li>
<% end %>
</ul>
Edit is now broken, as well, since we don't access collections as arrays
showNote method we need to make a couple of adjustmentsid - 1, since get takes an id, not an indexChange the router to call .get on the AllNotes collection instead of []
class App.Routers.ScratchPadRouter extends Backbone.Router routes: '': -> 'index' '/notes/:id': 'showNote'
index: -> view = new App.Views.Notes(collection: App.AllNotes) $('#container').html(view.render().el)
showNote: (id) -> model = App.AllNotes.get(id) view = new App.Views.EditNote(model: model) $('#container').html(view.render().el)
Check everything is still working
Now for the magic. All we need to do in order to make our views save is change
the call to set to save, passing in the same arguments in our EditNote
Backbone view's saveModel method.
saveModel: (e) ->
@model.save
title: @$('.title').val()
content: @$('.content').val()
Backbone.history.navigate('/', trigger: true)
false