This is the first 2 parts of a series of presentations demonstrating the usage of Backbone and Backbone.Marionette towards building "large scale" JS apps. Presented on 02/02/2013 for #GreeceJS.
a Rails app • Most popular member of the larger family of MV(C) Javascript Frameworks • Large ecosystem of extensions and plugins • Not AMD compatible itself but there are AMD compatible forks Created By
…well and a bunch of plugins • No real structure in place • Domain objects or business logic state in the DOM • Globals to share state • Deep nested piles of jQuery callbacks Created for Help you get your truth out of the DOM!
framework for adding structure to your client-‐ side code.” Addy Osmani “Backbone is a JavaScript library with a RESTful JSON interface, and is based on the model– view–presenter (MVP) applicaDon design paradigm.” Wikipedia “Backbone is a library that provides a set of structures to help you organize your JavaScript code” Thoughtbot Backbone.js gives “structure to web applicaDons by providing models with key-‐value binding and custom events, collecDons with a rich API of enumerable funcDons,views with declaraDve event handling, and connects it all to your exisDng API over a RESTful JSON interface” Jeremy Ashkenas
paradigm to your app • Models • CollecDons • Views • Events • Router(s) “Whatever business you did using only jQuery / Mootools / Prototype can be extracted into pure JavaScript structures” “JavaScript objects are the core and the DOM is merely a representa>on of that data” Provides
• Sync Layer (CRUD via Ajax) • Inheritance via prototype chaining About the word Model now... • No schema! • No built-‐in relaDonal associaDons. • No built-‐in traversing of nested properDes support.
element on the page • Defines the logic* for how a model should be presented to the user OpDons directly a/ached to the view • model • collecDon • el • id • className • tagName • a/ributes A few words
the view • Usually used with a template engine but sDll BOILERPLATE CODE #render <ar>cle id="todo-‐view" class="todo"></ar>cle> <ar>cle id="todo-‐view" class="todo"> <h3>Prepare BackboneJS slides #!@#!</h3> </ar>cle>
DOM upon creaDon of the view instance • ARached manually later • $el = $(el) • el isn’t on the page unDl placed there by you. • All view contents are inserted at once element
or its contents Under the hood: • jQuery's on / delegate is used to provide instant support for event delegaDon. • this inside all DOM event handlers always refers to the view instance! • Manually a/ach all other listeners as event listeners "<event> <selector>": "<method>"
it! 0.9.9 came to the rescue for all the rest: #listenTo #stopListening Can leak memory. Lots of it! They get cleaned up for you by jQuery / Zepto. Stores bindings on “this” Unbinds stored bindings
• HTML with other EL : Mustache, Handlebars, Hamlc • Selector based : PURE Too many opDons ! IteraDng a collecDon inside the template ? Seems ok doesn’t it?
box • but you can roll out your own 1st class route => components state mapper. • or use a subrouDng extension • or override so that 1 route triggered per Router /dashboard/todos/2/news/5 and Page State
• N widgets = N controllers • Domain vs PresentaDon objects • Observer pa/ern origin • TradiDonal = Event Based Back in the late 70s View Controller Model Updated through observaDon
Forms & Controls • Commands • Passive Views • Easier tesDng • Overcomes code like model.borderColor • GWT, ASP.NET Controller gets closer to the View View Model Presenter
fits model • View subscribes to Model • …BUT • View handles events • View handles templaDng • Controller split between Router & View • What about MVP? • Model fits model • Backbone.View ?= Presenter • Template = View • …BUT • Backbone.View can be an actual view = unique MV* flavor
Sandbox Mediator Module Module Module Module Submodule Submodule Publish noDficaDon Publish noDficaDon Start module Publish noDficaDon broadcast call method • AbstracDon of the core • Consistent Interface • Sole Survivor for modules • Security Guard • Exposes event bus • Core • Event Bus • Independent • Can depend on DOM • Do not access DOM outside their boxes • Do not create globals • Do not tell, but ask the facade Mail Chat Contacts News Addy Osmani Nicholas Zakas