Slide 1

Slide 1 text

Backbone A Brief Introduction Thursday, August 8, 13

Slide 2

Slide 2 text

What is Backbone • Gives structure to web applications • by providing models with key-value binding and custom events, • collections with a rich API of enumerable functions, • views with declarative event handling, • and connects it all to your existing API over a RESTful JSON interface. Thursday, August 8, 13

Slide 3

Slide 3 text

Backbone IS NOT • It is not a framework Thursday, August 8, 13

Slide 4

Slide 4 text

Structure Thursday, August 8, 13

Slide 5

Slide 5 text

Dependencies • jQuery (or Zepto) • underscore (or Lo-Dash) • JSON2.js (for old browsers such as IE) Thursday, August 8, 13

Slide 6

Slide 6 text

Components • Backbone.Events • Backbone.Model • Backbone.Collecti on • Backbone.View • Backbone.Router • Backbone.History • Backbone.sync Thursday, August 8, 13

Slide 7

Slide 7 text

Event Driven Events (mixin) Router History View Collection Model Thursday, August 8, 13

Slide 8

Slide 8 text

Events object = {} _.extend object, Backbone.Events object.on "alert", (msg) -> alert "Triggered " + msg object.trigger "alert", "an event" Thursday, August 8, 13

Slide 9

Slide 9 text

MVC View Controller* Model & Collection Control Event Thursday, August 8, 13

Slide 10

Slide 10 text

Controller • NO Backbone.Controller • Controller is a concept. Some put controller logic in Router, some put in View • Controller can be extracted out as collection of functions Thursday, August 8, 13

Slide 11

Slide 11 text

Controller Responsibilities • Construct views • Sync models/collections through API • Connect models/collections with views Thursday, August 8, 13

Slide 12

Slide 12 text

Controller Sample todos = new TodosCollection todosController = index: -> view = new TodoIndex collection: todos App.layout.content.show view.render() show: (id) -> todo = todos.get(id) view = new TodoShow model: todo App.layout.content.show view.render() Thursday, August 8, 13

Slide 13

Slide 13 text

Interaction View Controller* Router & History Manipulate DOM Tree DOM Events Control Event Update URL URL Change Back/Forward Thursday, August 8, 13

Slide 14

Slide 14 text

Sync Model & Collection Backbone.sync HTML5 localStorage $.ajax CouchDB Thursday, August 8, 13

Slide 15

Slide 15 text

Model & Collection Thursday, August 8, 13

Slide 16

Slide 16 text

Model • Key-value attributes • Changes events via set method: "change", "change[attribute]" • JSON serialization • Validation Thursday, August 8, 13

Slide 17

Slide 17 text

Collection • Array/Hash of Models • underscore methods • Collection events: "add", "remove", "reset" • Model events aggregation • JSON serialization Thursday, August 8, 13

Slide 18

Slide 18 text

class Todo extends Backbone.Model class TodosCollection extends Backbone.Collection model: Todo todo = new Todo title: "Backbone", done: true todos = new TodosCollection todos.add todo todos.add title: "Marionette", done: false todo.on 'change:done', (model) -> console.log model.toJSON() todos.on 'add', (model, coll) -> console.log "new item" Code Sample Thursday, August 8, 13

Slide 19

Slide 19 text

Backbone.sync • Model persistence • Signature sync(method, model, [options]) • method - CRUD • model - model or collection to save • options - callbacks, other options for sync implementation (e.g. jQuery ajax options) Thursday, August 8, 13

Slide 20

Slide 20 text

sync implementations • Bundled with RESTful API via jQuery.ajax • jeromegn/Backbone.localStorage • pyronicide/backbone.couchdb.js Thursday, August 8, 13

Slide 21

Slide 21 text

View Thursday, August 8, 13

Slide 22

Slide 22 text

DOM Manipulation • View is attached to DOM via el attribute • If el is not specified, it is created using tagName, id, className • Use render to setup the HTML in el Thursday, August 8, 13

Slide 23

Slide 23 text

Code Sample class TodoShow extends Backbone.View tagName: 'li' className: 'todo-item' # It is good practices to use template instead, # such as Handlebars render: -> context = model.toJSON() @$el.html " #{context.title} " @ui = { label: @$('label'), input: @$('input') } if @model.get('done') @ui.input.prop 'checked', true @ui.label.css 'text-decoration', 'line-through' @ # It is a convention to return the view itself Thursday, August 8, 13

Slide 24

Slide 24 text

Handle Model Events class TodoShow extends Backbone.View initialize: -> # new methods in 1.0.0 # pay attention to events cycle @listenTo @model, 'change', @render ... Thursday, August 8, 13

Slide 25

Slide 25 text

Handle DOM Events • events attribute • {"event selector": "callback"} Thursday, August 8, 13

Slide 26

Slide 26 text

Code Sample class TodoShow extends Backbone.View events: 'click label': 'toggle' toggle: (e) -> e.preventDefault() e.stopPropagation() isDone = !@model.get('done') @model.set 'done', isDone Thursday, August 8, 13

Slide 27

Slide 27 text

Router & History Thursday, August 8, 13

Slide 28

Slide 28 text

Routes • Router is auto registered when new instance is created • routes attribute • {"url/pattern": "callback"} • Start routing # Use hash fragments Backbone.history.start() # or use HTML5 History API # Backbone.history.start({pushState: true}) Thursday, August 8, 13

Slide 29

Slide 29 text

Code Sample class TodoRouter extends Backbone.Router routes: '': 'activeTodos' 'all': 'allTodos' activeTodos: -> todosController.index(onlyActive: true) allTodos: -> todosController.index() Thursday, August 8, 13

Slide 30

Slide 30 text

Further Readings Thursday, August 8, 13

Slide 31

Slide 31 text

Documentation • http://backbonejs.org/ • Developing Backbone.js Applications (free ebook) http://addyosmani.github.io/ backbone-fundamentals/ Thursday, August 8, 13

Slide 32

Slide 32 text

Resources • Sample: http://todomvc.com/architecture- examples/backbone/ • https://github.com/jashkenas/backbone/wiki/ Extensions,-Plugins,-Resources Thursday, August 8, 13

Slide 33

Slide 33 text

Marionette • Application library based on Backbone • Scale for large JavaScript applications • Collection of common design, good patterns and best practices Thursday, August 8, 13

Slide 34

Slide 34 text

Marionette Resources • http://marionettejs.com/ • Backbone.Marionette.js: A Gentle Introduction ($17) https://leanpub.com/ marionette-gentle-introduction • Building Backbone Plugins ($25) https:// leanpub.com/building-backbone-plugins Thursday, August 8, 13