main.js for Library app built using Backbone

http://arvindr21.github.io/BackbonejsLibraryapp/

Date: 2014, Jan.

Self Executing anonymous passing in jQuery

(function ($) {

Storing an Array of books for the library app. In this example we will not interact with the server to fetch data.

    var books = [{title:"JS the good parts", author:"John Doe", releaseDate:"2012", keywords:"JavaScript Programming"},
        {title:"CS the better parts", author:"John Doe", releaseDate:"2012", keywords:"CoffeeScript Programming"},
        {title:"Scala for the impatient", author:"John Doe", releaseDate:"2012", keywords:"Scala Programming"},
        {title:"American Psyco", author:"John Doe", releaseDate:"2012", keywords:"Novel Slasher"},
        {title:"Eloquent JavaScript", author:"John Doe", releaseDate:"2012", keywords:"JavaScript Programming"}];

Init the model. A Book. Lets set a default for the cover image. You know, just in case.

    var Book = Backbone.Model.extend({
        defaults:{
            coverImage:"http://placehold.it/99x99"
        }
    });

Define the collection. The primary argument will be the type of Collection. i.e. A book, Which makes this collection a library entity.

    var Library = Backbone.Collection.extend({
        model:Book
    });

Reusable Book view. We Define a book view consisting of the following items
1. A tagName - The holder, can be anything/Div is default
2. A className - Optional
3. Template - To render the UI from
4. render() - The magic logic.

    var BookView = Backbone.View.extend({
        tagName:"div",
        className:"bookContainer",
If you did see the markup, we have a script tag 
which consists of the skeleton/template for the
Book View. This is extracted and cached here.
        template:$("#bookTemplate").html(),
        render:function () {
Using underscore and converting the html to 
a template.
            var tmpl = _.template(this.template);
this.el is what we defined in tagName. use $el 
to get access to jQuery html() function
Pass the model to the Template, and the template
will populate the markup based on the model.
(neat ha..)
            this.$el.html(tmpl(this.model.toJSON())); 
            return this; // Chaining things
        }
    });

Library view uses pieces of Book view to build itself.

    var LibraryView = Backbone.View.extend({
        el:$("#books"),

Init method, get the books collections & trigger the render method.

        initialize:function(){
            this.collection = new Library(books);
            this.render();
        },

Using underscore's each method, we iterate through all the books. Then call a method to render each item to the UI.

        render: function(){
            var that = this;
            _.each(this.collection.models, function(item){
                that.renderBook(item);
            });
        },

renderBook, internally calls the Book View and passes a model to it. This will spit out the view for each book, which gets appended to the Library View.

        renderBook:function(item){
            var bookView = new BookView({
                model: item
            });
            this.$el.append(bookView.render().el);
        }
    });

The Controller/Router - Lets define some routes, one to view all the books in library and one to view a selected book.

    var LibraryRouter = Backbone.Router.extend({

ex url: <scheme>://<host>:<port>/<path>&<parameters>?<query>#<fragment> ''
If nothing is present as part of the fragment/Query, we show the complete library 'View/:id' : Match any route that has a 'View' as part of the fragment and anything after that as ID

        routes: {
            '': 'showLibrary',
            'View/:id': 'view' // #View/1
        },

        showLibrary: function (id) {
Call the library view 
            var libraryView = new LibraryView();
        },

        view: function (id) {

Call the individual book view

           var book = new Book({
         			 title:"Some title",
      				author:"John Doe",
          			releaseDate:"2012",
          keywords:"JavaScript Programming"
        });

      bookView = new BookView({
          model: book
      });

      $("#books").html(bookView.render().el);
        }
    });

    var appRouter = new LibraryRouter();
    Backbone.history.start();




})(jQuery);