client-side kung-fuintec132/wiki.files/backbonejs.pdf · 2013-04-30 · questions preface why...

86
Client-side Kung-Fu with Backbone.js Gur Dotan @gurdotan http://github.com/gurdotan

Upload: others

Post on 29-May-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Client-side Kung-Fu

with Backbone.js

Gur Dotan

@gurdotan

http://github.com/gurdotan

Page 2: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

igloolab.com

@iloveigloo

michele.berto.li

@MicheleBertoli

Credits

Page 3: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Agenda

Page 4: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Questions

Preface

Why Backbone.js

Backbone.js Architecture

Backbone.js code

Sample App – if time permits

Page 5: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Preface

Page 6: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Handlebars

Client side templates

{

name : “Shimon”,

title : “President”

}

<div>

<h1> Name: {{name}} </h1>

<h2> Title: {{title}} </h2>

</div>

<div>

<h1> Name: Shimon </h1>

<h2> Title: President </h2>

</div>+ =

Context

Template

HTML

Page 7: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Handlebars

Client side templates

var template = Handlebars.compile($(“#person-template”));

var html = template({ name: “Shimon”, title: “President” });

$(“body”).append(html);

<script id=“person-template” type=“text/x-handlebars-template”>

<div>

<h1> Name: Shimon </h1>

<h2> Title: President </h2>

</div>

</script>

Page 8: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Underscore

• Utility tool-belt

• Cross browser

• Ruby inspired syntax

_.each([“Yair”, “Zipi”, “Shelly”], function(item) {

// So something…

});

Page 9: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why

Backbone.js

Page 10: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

Browsers used to be weak, stupid creatures

1994 2001

Page 11: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

• Browsers became powerful

• Web applications became more complex

• The complexity moved to the client

Page 12: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

Yahoo (1998) Yahoo (2010)

Page 13: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

From server-side to client-side

We need efficient tools

Page 14: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

jQuery is cool but…

Page 15: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

jQuery is cool but…

We have to store object informations into

the DOM

var list = "";

$.each(data, function (index, value) {

list += "<li id=‘item-" + value.Id + “’>" + value.Name + "</li>";

});

$("ul").append(list);

Page 16: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

jQuery is cool but…

We have to store object informations into

the DOM

var list = "";

$.each(data, function (index, value) {

list += "<li id=‘item-" + value.Id + “’>" + value.Name + "</li>";

});

$("ul").append(list);

Page 17: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

$.getJSON("/Items", function (data) {

var list = "";

$.each(data, function (index, value) {

list += "<li id=\"item-" + value.Id + "\">" + value.Name + "</li>";

});

$("ul").append(list);

$("li").click(function () {

var $this = $(this);

var id = $this.attr("id").replace("item-", "");

$.post("/Items", { id: id }, function () {

$this.fadeOut(function () {

$this.remove();

});

});

});

});

jQuery is cool but…

jQuery callback hell

Page 18: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

jQuery is cool but…

jQuery callback hell

$.getJSON("/Items", function (data) {

var list = "";

$.each(data, function (index, value) {

list += "<li id=\"item-" + value.Id + "\">" + value.Name + "</li>";

});

$("ul").append(list);

$("li").click(function () {

var $this = $(this);

var id = $this.attr("id").replace("item-", "");

$.post("/Items", { id: id }, function () {

$this.fadeOut(function () {

$this.remove();

});

});

});

});

Page 19: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

“It's all too easy to

create JavaScript

applications that end

up as tangled piles of

jQuery selectors and

callbacks.”

Page 20: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

So, what we need?

• Separation of Concerns.

• Decoupling UI from Data.

• Describe what, not how

Page 21: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

Bad Separation of Concerns

$.getJSON("/Items", function (data) {

var list = "";

$.each(data, function (index, value) {

list += "<li id=\"item-" + value.Id + "\">" + value.Name + "</li>";

});

$("ul").append(list);

$("li").click(function () {

var $this = $(this);

var id = $this.attr("id").replace("item-", "");

$.post("/Items", { id: id }, function () {

$this.fadeOut(function () {

$this.remove();

});

});

});

});

Server communication

DOM event handling

Markup \ JS spaghetti

DOM manipulation

Animation

Page 22: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

So, what do we really need?

• Models and Views

• Events (so models and views can “talk”).

• A solid routing system.

• Server data layer. (not in lecture scope)

• A lightweight JavaScript framework.

Page 23: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Why Backbone.js

It exists and it’s called:

Backbone.js

Page 24: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Who’s

using it?

Page 25: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Real World

Linkedin

Page 26: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Real World

FourSquare

Page 27: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Real World

Groupon

Page 28: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Real World

Basecamp

Page 29: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Page 30: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

MVC

Controller

Model View

Page 31: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Jeremy

Ashkenas

Creator of:

Page 32: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Jeremy

Ashkenas

Page 33: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 34: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 35: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 36: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 37: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 38: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Backbone.js 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.

Page 39: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Dependencies:

+

Page 40: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Model

• Represents data

• Throws events.

• Reusable.

• Handling persistence. (not in scope)

Page 41: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

• Fetch

• Save (new)

• Save

• Destroy

/url

/url

/url/id

/url/id

HTTP GET

HTTP POST

HTTP PUT

HTTP

DELETE

Model / Collection - View - Template - Router - Utilities

Model – server persistence (not in scope)

Page 42: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var Item = Backbone.Model.extend({

idAttribute: “studentId”,

urlRoot: “/Items” // not in lecture scope

});

Model / Collection - View - Template - Router - Utilities

Defining a Model

Page 43: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var item = new Item();

Model / Collection - View - Template - Router - Utilities

Models + Events

Page 44: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var item = new Item();

item.on(“change:name”, function() {

alert(“Name is: “ + this.get(“name”));

});

Model / Collection - View - Template - Router - Utilities

Models + Events

Page 45: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var item = new Item();

item.on(“change:name”, function() {

alert(“Name is: “ + this.get(“name”));

});

item.set( { name: “Moshe” } ); // trigger change

// What do we get?

Model / Collection - View - Template - Router - Utilities

Models + Events

Page 46: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var item = new Item();

item.set({

name : “Austin Powers”,

sex : “Yes Please”

});

alert(item.get(“name”));

Model / Collection - View - Template - Router - Utilities

var item = {};

item.name = “Austin Powers”;

item.sex = “Yes Please”;

alert(item.name);

Backbone.Model

+ set \ get

Native Javascript

objects + attributes

VS

Page 47: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var item = new Item();

item.set( { Name: “Igloo” } ); // trigger change

item.save(); // trigger sync. Not in lecture scope

Model / Collection - View - Template - Router - Utilities

Save changes to server – not in scope

Page 48: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

• extend

• constructor / initialize

• get

• set

• escape

• has

• unset

• clear

• id

• idAttribute

• cid

• attributes

• defaults

• toJSON

• fetch

• save

• destroy

• validate

• isValid

• url

• urlRoot

• parse

• clone

• isNew

• change

• hasChanged

Model / Collection - View - Template - Router - Utilities

Model methods• changedAttributes

• previous

• previousAttributes

Page 49: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Collection• A list of models.

• Underscore methods.

Page 50: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var Items = Backbone.Collection.extend({

model: Item,

url: "/Items" // not in lecture scope});

Model / Collection - View - Template - Router - Utilities

Defining a Collection

Page 51: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var items = new Items();

items.add({name: “Pencil”}); // triggers “add” on collection

Model / Collection - View - Template - Router - Utilities

Initializing a Collection

Page 52: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var items = new Items([ {name: “Pencil”}, {name: “Pen”} ]);

Model / Collection - View - Template - Router - Utilities

Initializing a Collection

Page 53: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var items = new Items();

items.fetch(); // trigger “reset”. Not in lecture scope

Model / Collection - View - Template - Router - Utilities

Fetching a Collection from server

Page 54: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Collection methods

• extend

• model

• constructor / initialize

• models

• toJSON

• add

• remove

• get

• getByCid

• at

• length

• comparator

• sort

• pluck

• url

• parse

Model / Collection - View - Template - Router - Utilities

• fetch

• reset

• create

Page 55: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Collection – underscore methods

Model / Collection - View - Template - Router - Utilities

• forEach (each)

• map

• reduce (foldl, inject)

• reduceRight (foldr)

• find (detect)

• filter (select)

• reject

• every (all)

• some (any)

• include

• invoke

• max

• min

• sortBy

• groupBy

• sortedIndex

• shuffle

• toArray

• size

• first

• initial

• rest

• last

• without

• indexOf

• lastIndexOf

• isEmpty

• chain

Page 56: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

View• Manipulates the DOM.

• Delegates DOM events.

• Has a Model / Collection.

Page 57: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Views

listen to Model

events

Page 58: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Events

Model / Collecction - View - Template - Router - Utilities

Artist

Album

Model View

Trigger

events

Listen to

events

var Album = Backbone.Model.extend();

var album = new Album();

var AlbumView = Backbone.View.extend({

initialize: function() {

this.model.on(“change”, this.render)

},

render: function() {…}

});

var view = new AlbumView({model: album});

1 2

Page 59: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Events

Model / Collecction - View - Template - Router - Utilities

Pink Floyd

The Wall

change:artist

“Pink Floyd”

change:album

“The Wall”

Model View

album.set({ artist: “Pink Floyd”});

album.set({ album: “The Wall”});

// view.render

// view.render

3 4

Page 60: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

Collection View

Model / Collecction - View - Template - Router - Utilities

View (Model)

View (Collection)

Page 61: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.on("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

Page 62: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.bind("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

Page 63: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.on("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

Page 64: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.on("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

Page 65: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.on("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

Page 66: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

var ItemView = Backbone.View.extend({

tagName: "li",

render: function () {

this.$el.text(this.model.get("Name"));

return this;

}

});

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ListView = Backbone.View.extend({

el: $("ul"),

initialize: function () {

this.collection.on("reset", this.render, this);

},

render: function () {

this.collection.each(this.addItem, this);

return this;

},

addItem: function (item) {

var itemView = new ItemView({

model: item

});

this.$el.append(itemView.el);

itemView.render();

}

});

Page 67: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var items = new Items();

var listView = new ListView({

collection: items

});

items.fetch();

Page 68: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Views

listen to DOM

events

Page 69: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var ItemView = Backbone.View.extend({

events: {

“click .btn” : “onClick”

},

onClick: function() {

alert(“You just clicked”);

}

})

var view = new ItemView({el: $(“#item”) });

// User clicks on button. What happens?

Model / Collection - View - Template - Router - Utilities

Page 70: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

var ItemView = Backbone.View.extend({

events: {

“click .btn” : “onClick”

},

onClick: function() {

alert(“You just clicked”);

}

})

var view = new ItemView({el: $(“#item”) });

// User clicks on button. What happens?

Model / Collection - View - Template - Router - Utilities

Uses jQuery

behind the scenes

Page 71: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

View

• $ (jQuery or Zepto)

• render

• remove

• make

• delegateEvents

• undelegateEvents

Model / Collecction - View - Template - Router - Utilities

• extend

• constructor / initialize

• el

• $el

• setElement

• attributes

Page 72: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Template (Underscore.js)

Compiles JavaScript templates into functions

that can be evaluated for rendering.

• Mustache

• jQuery-tmpl

Page 73: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

<script type="text/template" id="item-template">

<li>

<%= Name %>

</li>

</script>

Page 74: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var ItemView = Backbone.View.extend({

template: _.template($("#item-template").html()),

...

render: function () {

this.$el.html(this.template(this.model.toJSON()));

return this;

}

});

Page 75: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

• Maps urls to function.

• Enable history / bookmarking.

Router

Page 76: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

var AppRouter = Backbone.Router.extend({

routes: {

"": "initialize“

},

initialize: function () {

}

});

Page 77: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Architecture

window.AppRouter = Backbone.Router.extend({

routes: {

"": "loadInvoices",

"/add": "addInvoice",

"/show/:id": "showInvoice",

"/edit/:id": "editInvoice“

},

loadInvoices: function () {

},

addInvoice: function () {

},

showInvoice: function (id) {

},

editInvoice: function (id) {

}

});

Model / Collecction - View - Template - Router - Utilities

Page 78: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Router

ArchitectureModel / Collecction - View - Template - Router - Utilities

• extend

• routes

• constructor / initialize

• route

• navigate

Page 79: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

Router View

Model /Collection

Template

Data

Source

Page 80: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

Router View

Model /Collection

Template

Data

Source

Page 81: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

ArchitectureModel / Collecction - View - Template - Router - Utilities

Router View

Model /Collection

Template

Data

Source

Controller

Model

View

State MachineServer

Page 82: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Extras

Page 83: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Extras

Plugins

• Backbone-Nested

• Backbone.Memento

• Backbone.Validations

• Backbone.localStorage

• …

https://github.com/documentcloud/backbone/wiki/Extensions%2C-

Plugins%2C-Resources

Page 84: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Extras

• http://www.igloolab.com/downloads/backbone-cheatsheet.pdf

Cheat Sheet

Page 85: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

Backbone.js

-

• Lightweight

• Powerful

• Code is clean (and maintainable)

+

• Too verbose (for small applications)

Page 86: Client-side Kung-Fuintec132/wiki.files/BackboneJS.pdf · 2013-04-30 · Questions Preface Why Backbone.js Backbone.js Architecture Backbone.js code Sample App –if time permits

3Lago di Garda

Questions ?

Credits:www.igloolab.com

@iloveigloo