SlideShare a Scribd company logo
Creating Single Page Web App
using

Akshay Mathur
Akshay Mathur
• Founding Team Member of
– ShopSocially (Enabling “social” for retailers)
– AirTight Neworks (Global leader of WIPS)

• 15+ years in IT industry
– Currently Principal Architect at ShopSocially
– Mostly worked with Startups
• From Conceptualization to Stabilization
• At different functions i.e. development, testing, release
• With multiple technologies

@akshaymathu

2
What have we learnt
• Creating basic web pages
– HTML tags
– CSS

• Basic JavaScript and jQuery
–
–
–
–

Reading and writing DOM
Getting data using AJAX calls
Responding to browser events
jQuery templates

• CoffeeScript
• Object Oriented JavaScript
– JS Classes
– Extending classes using prototypes
BackboneJS
• Provides MVC structure for JavaScript
• Built on top of UnderscoreJS
• Other than Model, View and Controller
(Router) also provides Event and Collection
objects
– Using custom events help writing good code and
eliminates use of global variables
– Array of Models with same structure can be
combined into Collection for ease of handling
@akshaymathu

4
UnderscoreJS
• Has nothing to do with MVC
• Provides many useful functions on
– Arrays
– Objects
– Array of Objects

• BackboneJS directly extends a few functions
for its objects (Classes)

@akshaymathu

5
BackboneJS code
class LoginModel extends Backbone.Model
class LoginView extends Backbone.View
initialize: =>
@template = $(’#login_template').template()
@render()
render: =>
$(@el).html $.tmpl(@template, @model.toJSON())
events: =>
'click #login_btn' : ’login_handler’
login_handler: (ev) =>
window.mpq_track ’Login Click’
class LoginController extends Backbone.Router
initialize: =>
@l_model = new LoginModel window.app_info
@l_view = new LoginView model: model, el: ’#login_div’

@akshaymathu

6
Backbone View
• A View is created by extending a Backbone’s
view class
• A View always have 2 properties:
– el: An HTML element that is in the root of the
View
– model: Model that powers data to the View

@akshaymathu

7
Creating View
class LoginView extends Backbone.View
initialize: =>
@template = $.template(
$(’#login_template’))
@render()
render: =>
$(@el).html $.tmpl(@template,
@model.toJSON())
class LoginController extends Backbone.Router
initialize: =>
@l_model = new LoginModel window.app_info
@l_view = new LoginView model: @l_model,
el: ’#login_div’

@akshaymathu

8
Rendering HTML
• Typically a view has a template
• In the render method, the template should be
filled with data and inserted into el
– The el can be attached to DOM before or after filling
HTML
class LoginView extends Backbone.View
initialize: =>
@template = $.template
$(’#login_template’)
render: =>
$(@el).html $.tmpl(@template,
@model.toJSON())
@akshaymathu

9
Browser Events
• Defining events object within a view
automatically connects functions to event
handlers
class LoginView extends Backbone.View
events:
'click #login_btn' : ’login_handler’
login_handler: (ev) =>
window.mpq_track ’Login Click’
@akshaymathu

10
Design Views for
• http://explore-venues.appspot.com/

@akshaymathu

11
Thinking of Views
• Create a view for whole page
– Base view that can handle anything as needed
– It may be rendered by server

• A view for each unit that is logically different
– Event handling is needed within

• Keep separate model for each view

@akshaymathu

12
Zombie Views
• When new views are created from a view class
and attached to DOM in a way that it replaces
HTML of an old view
– The old view object and its events remain attached
and create issues
$(“#button”).click ->
@view = new SomeView
Class SomeView extends backbone.View
render: =>
$(“container”).html template_html

@akshaymathu

13
Handling Zombies
• Don’t let zombies create
• Use .destroy() on the View instance
• Cleanup associated model if needed
$(“#button”).click ->
@view = new SomeView
$(“#close_button”).click ->
@view.destroy()
@akshaymathu

14
@akshaymathu

15
Backbone Model
• Model is defined extending the Backbone’s
Model Class
• The Model object can be created with the
data coming from the server (database)
• The data can be read later using .get() and set
using .set() methods
• Transient data (not intended to be synced with
server) can be stored separately
@akshaymathu

16
Creating Model
app_info = {type: 4,
name: ‘Internal Application’,
protected: true
}
class LoginModel extends Backbone.Model
initialize: =>
@is_changed = false

class LoginRouter extends Backbone.Router
initialize: =>
@l_model = new LoginModel app_info
@akshaymathu

17
Data Manipulation
• Read
old_name = @model.get ‘name’
• Write
new_name = old_name.toLower()
@model.set ‘name’, new_name
@model.is_changed = true

@akshaymathu

18
Model Events
• Model object raises events on change in data
– changed
– remove

• These events may be captured (by view) and
acted upon accordingly
– A few properties are also set within the Model
– Old and new values of the Model are also
available
@akshaymathu

19
Keeping UI Up-to-Date
class LoginView extends Backbone.View
initialize: =>
@model.bind(‘change’, @render)
@render()
render: =>
$(@el).html $.tmpl(@template,
@model.toJSON())
class LoginRouter extends Backbone.Router
initialize: =>
@l_model = new LoginModel app_info
@l_view = new LoginView model:@l_model
@akshaymathu

20
Syncing with Server
• For having better control over data, one
should collect data from the Model and make
an AJAX call
• One can also attach a URL to the Model and
RESTful AJAX calls are automatically done

@akshaymathu

21
Collections
• Simple data structure for storing many
instances of same model
– Array of Model objects

• Provides methods and properties for
managing the list
• Can be created by extending Collection class
of Backbone

@akshaymathu

22
Creating Collection
class VenueModel extends Backbone.Model
class VenueCollection extends Backbone.Collection
model: VenueModel
class VenueListModel extends Backbone.Model
initialize: =>
@e_list = new VenueCollection
class VenueListView extends Backbone.View
initialize: =>
@model.e_list.bind('add', @add_venue)
add_venue: (venue_model) =>

@akshaymathu

23
@akshaymathu

24
Backbone Router
• It routes URLs to respective methods
• A Router is created by extending a Backbone’s
router class
• Route configuration can be passed while
creating the router object instance

@akshaymathu

25
Creating Router
class LoginController extends Backbone.Router
initialize: =>
@l_model = new LoginModel window.app_info
@l_view = new LoginView model: model, el:
’#login_div’
routes:
“help”: “help”
$(document).ready ->
l_router = new LoginController()
@akshaymathu

26
Route Configuration
• Rout configuration is a JavaScript object
mapping URLs to functions
– URL patterns may be used as key
– Data can be read from URLs and passed to
functions as parameters

@akshaymathu

27
Routes at Work
routes:
"help": "help” // #help
"search/:query": "search",
// #search/kiwis
"search/:query/p:page": "search"
// #search/kiwis/p7

help: ->
search: (query, page)->
@akshaymathu

28
Catch All
• Router is sometimes used for putting methods
not belonging to any other Model or View
• Router also acts as a glue for all other objects
– Typically all basic views are initialized in router so
any cross-view functionality can be implemented
in router

@akshaymathu

29
@akshaymathu

30
Events
• Events facilitate communication amongst
different objects
– Data can be passed along with events

• Browser raises events on user actions
• Publish-Subscribe architecture avoids tight
coupling between objects

@akshaymathu

31
Backbone Events
• Backbone objects also raise events on various
actions
– add: when a model is added to a collection.
– remove: when a model is removed from a collection.
– reset: when the collection's entire contents have
been replaced.
– change: when a model's attributes have changed.
– change: when a specific attribute has been updated.
– destroy: when a model is destroyed.
@akshaymathu

32
Custom Events
• Backbone’s event module can be mixed with
an object
– The the objects gets the ability to raise events
programmatically
– The object also gets the ability to listen to the
events

@akshaymathu

33
Defining Custom Events
EventDispatcher =
SHOW_VENUE: 'show_venue'
CLEAN: 'clean'
_.extend(EventDispatcher,
Backbone.Events)

@akshaymathu

34
Using Custom Events
ED = EventDispatcher
class VenuetView extends Backbone.View
initialize: =>
ED.bind ED.CLEAN, @remove_self
class VenueListView extends Backbone.View
initialize: =>
@model.e_list.bind('add', @add_venue)
ED.bind ED.CLEAN, @reset_col
clean_old_list: =>
@venue_list_model.e_list.reset()
ED.trigger ED.CLEAN
@akshaymathu

35
@akshaymathu

36
Go Hands-on
Explore FourSquare Venues
http://explore-venues.appspot.com/
@akshaymathu

38
Design Views
• Page view
– Accordion
– Google Map

• Venue list view
– All venue tiles

• Venue view
– Single venue tile

• Venue details view (do later)
– Popup with details of the venue
@akshaymathu

39
Design Models
• As a thumb rule, a model can be kept for each
view
– Page model
– Venue list model
– Venue model
– Venue details model (do later)

@akshaymathu

40
Create Base HTML
• Head
– Include Bootstrap CSS
– Include JS
• Google Map API, jQuery’s , jQuery template
• Bootstrap, Underscore, Backbone, App’s custom

• Top bar
– Use navbar’s HTML from Bootstrap

• Accordion
– Use Bootstrap jQuery plugin’s HTML
– Create accordion headers
– Keep accordion bodies blank
@akshaymathu

41
Create jQuery Templates
• No template for Google Map
– Map UI is completely rendered by Google APIs

• Venue template
– Each venue tile

• Venue details template (do later)
– Venue details popup
– Use Bootstrap modal jQuery plugin’s HTML

@akshaymathu

42
@akshaymathu

43
Create CoffeeScript
Basic Skeleton
class VenueModel extends Backbone.Model
class VenueCollection extends Backbone.Collection
model: VenueModel
class VenueListModel extends Backbone.Model
initialize: =>
@e_list = new VenueCollection
class VenueListView extends Backbone.View
initialize: =>
@model.e_list.bind('add', @add_venue)
class VenueView extends Backbone.View
class PageModel extends Backbone.Model
class PageView extends Backbone.View
class VenueController extends Backbone.Router
@akshaymathu

45
Start Execution
• On DOM ready event, instantiate the router
$(document).ready ->
venue_controller = new VenueController

• Create an instance of page model and view in initialize
routine of router
class VenueController extends
Backbone.Router
initialize: =>
@page_model = new PageModel
@page_view = new PageView (
el: $("#maindiv"),
model: @page_model)
@akshaymathu

46
Initialize Page View
• Page view initializes automatically when its
instance gets created in router
• Initialize venue list
class PageView extends Backbone.View
initialize: =>
@venue_list_model = new VenueListModel
@venue_list_view = new VenueListView(
el: $("#venue_list"),
model: @venue_list_model
)

@akshaymathu

47
Google Map
• In page view, create Google Map object and render it in the div
created for that
• Register event handler for Google Map click event
@map = new google.maps.Map(
$(’#map-canvas’)[0]),
map_options)
google.maps.event.addListener @map,
'click', (ev) =>
@get_venues(
ev.latLng.lat(),
ev.latLng.lng())
@akshaymathu

48
Get Venues
• Make a JSONP AJAX call to FourSquare for getting
venues near the clicked location
• Create a model from each venue in result and
add to collection
venue_model = new VenueModel
item.venue
@venue_list_model.e_list.add
venue_model
@akshaymathu

49
Render Venue Tile
• As venue model adds into collection, the add event
handler on collection is fired in venue list view
@model.e_list.bind('add',
@add_venue)
• Handlers gets the venue view rendered and attaches it
to the DOM
add_venue: (venue_model) =>
venue_view = new VenueView(
model: venue_model)
tile_html = venue_view.render()
$("#venue_col).append tile_html
@akshaymathu

50
Click on Venue Tile
• Venue view registers click handler by defining event
map
class VenueView extends
Backbone.View
events:
"click" : 'show_details’
• Venue detail popup is to be shown outside base
element (el) of the venue view so it raises an event
show_details: =>
ED.trigger ED.SHOW_VENUE, @model
@akshaymathu

51
Showing Details Popup
• Page view listens to the event and renders
details popup
class PageView extends Backbone.View
initialize: =>
ED.bind ED.SHOW_VENUE, @show_popup
show_popup: (venue_model) =>
@detail_view = new VenueDetailView
model: venue_model
$(@el).append @detail_view.render()
@akshaymathu

52
@akshaymathu

53
Optimization
• Venue model and Venue detail model
represent exactly same entity
– There is always 1-1 relation

• Same model may be used for both
– First render should not be slow for bringing details

@akshaymathu

54
Thanks

@akshaymathu
@akshaymathu

55

More Related Content

PPTX
Object Oriented Programing in JavaScript
PPTX
Getting Started with Javascript
PDF
Simpler Core Data with RubyMotion
PPTX
SenchaCon 2016: Ext JS + React: A Match Made in UX Heaven - Mark Brocato
PPTX
SenchaCon 2016: How to Auto Generate a Back-end in Minutes - Per Minborg, Emi...
PDF
Performance Optimization and JavaScript Best Practices
PDF
Workshop 12: AngularJS Parte I
PDF
Activator and Reactive at Play NYC meetup
Object Oriented Programing in JavaScript
Getting Started with Javascript
Simpler Core Data with RubyMotion
SenchaCon 2016: Ext JS + React: A Match Made in UX Heaven - Mark Brocato
SenchaCon 2016: How to Auto Generate a Back-end in Minutes - Per Minborg, Emi...
Performance Optimization and JavaScript Best Practices
Workshop 12: AngularJS Parte I
Activator and Reactive at Play NYC meetup

What's hot (20)

PDF
Developing iOS REST Applications
PDF
Intro to node.js - Ran Mizrahi (28/8/14)
PDF
Understanding backbonejs
PPTX
Angularjs Basics
PDF
Getting started with node JS
PDF
Distributing information on iOS
PPTX
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
PDF
Core Data with multiple managed object contexts
PDF
"Migrate large gwt applications - Lessons Learned" By Harald Pehl
PDF
Building scalable applications with angular js
PPTX
AngularJS Beginners Workshop
PDF
Laravel 8 export data as excel file with example
KEY
Tools that get you laid
PPTX
AngularJs
PDF
An approach to responsive, realtime with Backbone.js and WebSockets
PDF
Parse London Meetup - Cloud Code Tips & Tricks
PDF
High Performance Core Data
PPTX
Angular js
PPT
Javascript and Jquery Best practices
PDF
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Developing iOS REST Applications
Intro to node.js - Ran Mizrahi (28/8/14)
Understanding backbonejs
Angularjs Basics
Getting started with node JS
Distributing information on iOS
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
Core Data with multiple managed object contexts
"Migrate large gwt applications - Lessons Learned" By Harald Pehl
Building scalable applications with angular js
AngularJS Beginners Workshop
Laravel 8 export data as excel file with example
Tools that get you laid
AngularJs
An approach to responsive, realtime with Backbone.js and WebSockets
Parse London Meetup - Cloud Code Tips & Tricks
High Performance Core Data
Angular js
Javascript and Jquery Best practices
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Ad

Similar to Creating Single Page Web App using Backbone JS (20)

PPTX
Backbonejs for beginners
PDF
Intro to BackboneJS + Intermediate Javascript
PPT
Backbone.js
PPTX
Backbone.js
PDF
Backbone.js
PDF
[2015/2016] Backbone JS
PPT
Vanjs backbone-powerpoint
KEY
Single Page Web Apps with Backbone.js and Rails
KEY
Prateek dayal backbonerails-110528024926-phpapp02
PDF
Viking academy backbone.js
PDF
Backbone.js
PDF
Backbone.js
PPTX
Backbone the Good Parts
ODP
Javascript frameworks: Backbone.js
PDF
Backbone JS for mobile apps
PDF
Developing maintainable Cordova applications
PDF
Developing Backbonejs Applications Early Release Addy Osmani
PDF
Introduction to Backbone.js
PDF
Raybiztech Guide To Backbone Javascript Library
PDF
Backbone.js slides
Backbonejs for beginners
Intro to BackboneJS + Intermediate Javascript
Backbone.js
Backbone.js
Backbone.js
[2015/2016] Backbone JS
Vanjs backbone-powerpoint
Single Page Web Apps with Backbone.js and Rails
Prateek dayal backbonerails-110528024926-phpapp02
Viking academy backbone.js
Backbone.js
Backbone.js
Backbone the Good Parts
Javascript frameworks: Backbone.js
Backbone JS for mobile apps
Developing maintainable Cordova applications
Developing Backbonejs Applications Early Release Addy Osmani
Introduction to Backbone.js
Raybiztech Guide To Backbone Javascript Library
Backbone.js slides
Ad

More from Akshay Mathur (19)

PPTX
Documentation with Sphinx
PPTX
Kubernetes Journey of a Large FinTech
PPTX
Security and Observability of Application Traffic in Kubernetes
PPTX
Enhanced Security and Visibility for Microservices Applications
PPTX
Considerations for East-West Traffic Security and Analytics for Kubernetes En...
PPTX
Kubernetes as Orchestrator for A10 Lightning Controller
PPTX
Cloud Bursting with A10 Lightning ADS
PPTX
Shared Security Responsibility Model of AWS
PPTX
Techniques for scaling application with security and visibility in cloud
PPTX
Introduction to Node js
PPTX
Getting Started with Angular JS
PDF
Releasing Software Without Testing Team
PPTX
Getting Started with jQuery
PPTX
CoffeeScript
PPTX
Getting Started with Web
PPTX
Using Google App Engine Python
PPTX
Working with GIT
PPTX
Testing Single Page Webapp
PPTX
Mongo db
Documentation with Sphinx
Kubernetes Journey of a Large FinTech
Security and Observability of Application Traffic in Kubernetes
Enhanced Security and Visibility for Microservices Applications
Considerations for East-West Traffic Security and Analytics for Kubernetes En...
Kubernetes as Orchestrator for A10 Lightning Controller
Cloud Bursting with A10 Lightning ADS
Shared Security Responsibility Model of AWS
Techniques for scaling application with security and visibility in cloud
Introduction to Node js
Getting Started with Angular JS
Releasing Software Without Testing Team
Getting Started with jQuery
CoffeeScript
Getting Started with Web
Using Google App Engine Python
Working with GIT
Testing Single Page Webapp
Mongo db

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
Chapter 2 Digital Image Fundamentals.pdf
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
cuic standard and advanced reporting.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPT
Teaching material agriculture food technology
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Cloud computing and distributed systems.
Chapter 2 Digital Image Fundamentals.pdf
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
cuic standard and advanced reporting.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Review of recent advances in non-invasive hemoglobin estimation
Diabetes mellitus diagnosis method based random forest with bat algorithm
The Rise and Fall of 3GPP – Time for a Sabbatical?
Chapter 3 Spatial Domain Image Processing.pdf
madgavkar20181017ppt McKinsey Presentation.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
20250228 LYD VKU AI Blended-Learning.pptx
Teaching material agriculture food technology
GamePlan Trading System Review: Professional Trader's Honest Take
NewMind AI Weekly Chronicles - August'25 Week I
Understanding_Digital_Forensics_Presentation.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

Creating Single Page Web App using Backbone JS

  • 1. Creating Single Page Web App using Akshay Mathur
  • 2. Akshay Mathur • Founding Team Member of – ShopSocially (Enabling “social” for retailers) – AirTight Neworks (Global leader of WIPS) • 15+ years in IT industry – Currently Principal Architect at ShopSocially – Mostly worked with Startups • From Conceptualization to Stabilization • At different functions i.e. development, testing, release • With multiple technologies @akshaymathu 2
  • 3. What have we learnt • Creating basic web pages – HTML tags – CSS • Basic JavaScript and jQuery – – – – Reading and writing DOM Getting data using AJAX calls Responding to browser events jQuery templates • CoffeeScript • Object Oriented JavaScript – JS Classes – Extending classes using prototypes
  • 4. BackboneJS • Provides MVC structure for JavaScript • Built on top of UnderscoreJS • Other than Model, View and Controller (Router) also provides Event and Collection objects – Using custom events help writing good code and eliminates use of global variables – Array of Models with same structure can be combined into Collection for ease of handling @akshaymathu 4
  • 5. UnderscoreJS • Has nothing to do with MVC • Provides many useful functions on – Arrays – Objects – Array of Objects • BackboneJS directly extends a few functions for its objects (Classes) @akshaymathu 5
  • 6. BackboneJS code class LoginModel extends Backbone.Model class LoginView extends Backbone.View initialize: => @template = $(’#login_template').template() @render() render: => $(@el).html $.tmpl(@template, @model.toJSON()) events: => 'click #login_btn' : ’login_handler’ login_handler: (ev) => window.mpq_track ’Login Click’ class LoginController extends Backbone.Router initialize: => @l_model = new LoginModel window.app_info @l_view = new LoginView model: model, el: ’#login_div’ @akshaymathu 6
  • 7. Backbone View • A View is created by extending a Backbone’s view class • A View always have 2 properties: – el: An HTML element that is in the root of the View – model: Model that powers data to the View @akshaymathu 7
  • 8. Creating View class LoginView extends Backbone.View initialize: => @template = $.template( $(’#login_template’)) @render() render: => $(@el).html $.tmpl(@template, @model.toJSON()) class LoginController extends Backbone.Router initialize: => @l_model = new LoginModel window.app_info @l_view = new LoginView model: @l_model, el: ’#login_div’ @akshaymathu 8
  • 9. Rendering HTML • Typically a view has a template • In the render method, the template should be filled with data and inserted into el – The el can be attached to DOM before or after filling HTML class LoginView extends Backbone.View initialize: => @template = $.template $(’#login_template’) render: => $(@el).html $.tmpl(@template, @model.toJSON()) @akshaymathu 9
  • 10. Browser Events • Defining events object within a view automatically connects functions to event handlers class LoginView extends Backbone.View events: 'click #login_btn' : ’login_handler’ login_handler: (ev) => window.mpq_track ’Login Click’ @akshaymathu 10
  • 11. Design Views for • http://explore-venues.appspot.com/ @akshaymathu 11
  • 12. Thinking of Views • Create a view for whole page – Base view that can handle anything as needed – It may be rendered by server • A view for each unit that is logically different – Event handling is needed within • Keep separate model for each view @akshaymathu 12
  • 13. Zombie Views • When new views are created from a view class and attached to DOM in a way that it replaces HTML of an old view – The old view object and its events remain attached and create issues $(“#button”).click -> @view = new SomeView Class SomeView extends backbone.View render: => $(“container”).html template_html @akshaymathu 13
  • 14. Handling Zombies • Don’t let zombies create • Use .destroy() on the View instance • Cleanup associated model if needed $(“#button”).click -> @view = new SomeView $(“#close_button”).click -> @view.destroy() @akshaymathu 14
  • 16. Backbone Model • Model is defined extending the Backbone’s Model Class • The Model object can be created with the data coming from the server (database) • The data can be read later using .get() and set using .set() methods • Transient data (not intended to be synced with server) can be stored separately @akshaymathu 16
  • 17. Creating Model app_info = {type: 4, name: ‘Internal Application’, protected: true } class LoginModel extends Backbone.Model initialize: => @is_changed = false class LoginRouter extends Backbone.Router initialize: => @l_model = new LoginModel app_info @akshaymathu 17
  • 18. Data Manipulation • Read old_name = @model.get ‘name’ • Write new_name = old_name.toLower() @model.set ‘name’, new_name @model.is_changed = true @akshaymathu 18
  • 19. Model Events • Model object raises events on change in data – changed – remove • These events may be captured (by view) and acted upon accordingly – A few properties are also set within the Model – Old and new values of the Model are also available @akshaymathu 19
  • 20. Keeping UI Up-to-Date class LoginView extends Backbone.View initialize: => @model.bind(‘change’, @render) @render() render: => $(@el).html $.tmpl(@template, @model.toJSON()) class LoginRouter extends Backbone.Router initialize: => @l_model = new LoginModel app_info @l_view = new LoginView model:@l_model @akshaymathu 20
  • 21. Syncing with Server • For having better control over data, one should collect data from the Model and make an AJAX call • One can also attach a URL to the Model and RESTful AJAX calls are automatically done @akshaymathu 21
  • 22. Collections • Simple data structure for storing many instances of same model – Array of Model objects • Provides methods and properties for managing the list • Can be created by extending Collection class of Backbone @akshaymathu 22
  • 23. Creating Collection class VenueModel extends Backbone.Model class VenueCollection extends Backbone.Collection model: VenueModel class VenueListModel extends Backbone.Model initialize: => @e_list = new VenueCollection class VenueListView extends Backbone.View initialize: => @model.e_list.bind('add', @add_venue) add_venue: (venue_model) => @akshaymathu 23
  • 25. Backbone Router • It routes URLs to respective methods • A Router is created by extending a Backbone’s router class • Route configuration can be passed while creating the router object instance @akshaymathu 25
  • 26. Creating Router class LoginController extends Backbone.Router initialize: => @l_model = new LoginModel window.app_info @l_view = new LoginView model: model, el: ’#login_div’ routes: “help”: “help” $(document).ready -> l_router = new LoginController() @akshaymathu 26
  • 27. Route Configuration • Rout configuration is a JavaScript object mapping URLs to functions – URL patterns may be used as key – Data can be read from URLs and passed to functions as parameters @akshaymathu 27
  • 28. Routes at Work routes: "help": "help” // #help "search/:query": "search", // #search/kiwis "search/:query/p:page": "search" // #search/kiwis/p7 help: -> search: (query, page)-> @akshaymathu 28
  • 29. Catch All • Router is sometimes used for putting methods not belonging to any other Model or View • Router also acts as a glue for all other objects – Typically all basic views are initialized in router so any cross-view functionality can be implemented in router @akshaymathu 29
  • 31. Events • Events facilitate communication amongst different objects – Data can be passed along with events • Browser raises events on user actions • Publish-Subscribe architecture avoids tight coupling between objects @akshaymathu 31
  • 32. Backbone Events • Backbone objects also raise events on various actions – add: when a model is added to a collection. – remove: when a model is removed from a collection. – reset: when the collection's entire contents have been replaced. – change: when a model's attributes have changed. – change: when a specific attribute has been updated. – destroy: when a model is destroyed. @akshaymathu 32
  • 33. Custom Events • Backbone’s event module can be mixed with an object – The the objects gets the ability to raise events programmatically – The object also gets the ability to listen to the events @akshaymathu 33
  • 34. Defining Custom Events EventDispatcher = SHOW_VENUE: 'show_venue' CLEAN: 'clean' _.extend(EventDispatcher, Backbone.Events) @akshaymathu 34
  • 35. Using Custom Events ED = EventDispatcher class VenuetView extends Backbone.View initialize: => ED.bind ED.CLEAN, @remove_self class VenueListView extends Backbone.View initialize: => @model.e_list.bind('add', @add_venue) ED.bind ED.CLEAN, @reset_col clean_old_list: => @venue_list_model.e_list.reset() ED.trigger ED.CLEAN @akshaymathu 35
  • 37. Go Hands-on Explore FourSquare Venues http://explore-venues.appspot.com/
  • 39. Design Views • Page view – Accordion – Google Map • Venue list view – All venue tiles • Venue view – Single venue tile • Venue details view (do later) – Popup with details of the venue @akshaymathu 39
  • 40. Design Models • As a thumb rule, a model can be kept for each view – Page model – Venue list model – Venue model – Venue details model (do later) @akshaymathu 40
  • 41. Create Base HTML • Head – Include Bootstrap CSS – Include JS • Google Map API, jQuery’s , jQuery template • Bootstrap, Underscore, Backbone, App’s custom • Top bar – Use navbar’s HTML from Bootstrap • Accordion – Use Bootstrap jQuery plugin’s HTML – Create accordion headers – Keep accordion bodies blank @akshaymathu 41
  • 42. Create jQuery Templates • No template for Google Map – Map UI is completely rendered by Google APIs • Venue template – Each venue tile • Venue details template (do later) – Venue details popup – Use Bootstrap modal jQuery plugin’s HTML @akshaymathu 42
  • 45. Basic Skeleton class VenueModel extends Backbone.Model class VenueCollection extends Backbone.Collection model: VenueModel class VenueListModel extends Backbone.Model initialize: => @e_list = new VenueCollection class VenueListView extends Backbone.View initialize: => @model.e_list.bind('add', @add_venue) class VenueView extends Backbone.View class PageModel extends Backbone.Model class PageView extends Backbone.View class VenueController extends Backbone.Router @akshaymathu 45
  • 46. Start Execution • On DOM ready event, instantiate the router $(document).ready -> venue_controller = new VenueController • Create an instance of page model and view in initialize routine of router class VenueController extends Backbone.Router initialize: => @page_model = new PageModel @page_view = new PageView ( el: $("#maindiv"), model: @page_model) @akshaymathu 46
  • 47. Initialize Page View • Page view initializes automatically when its instance gets created in router • Initialize venue list class PageView extends Backbone.View initialize: => @venue_list_model = new VenueListModel @venue_list_view = new VenueListView( el: $("#venue_list"), model: @venue_list_model ) @akshaymathu 47
  • 48. Google Map • In page view, create Google Map object and render it in the div created for that • Register event handler for Google Map click event @map = new google.maps.Map( $(’#map-canvas’)[0]), map_options) google.maps.event.addListener @map, 'click', (ev) => @get_venues( ev.latLng.lat(), ev.latLng.lng()) @akshaymathu 48
  • 49. Get Venues • Make a JSONP AJAX call to FourSquare for getting venues near the clicked location • Create a model from each venue in result and add to collection venue_model = new VenueModel item.venue @venue_list_model.e_list.add venue_model @akshaymathu 49
  • 50. Render Venue Tile • As venue model adds into collection, the add event handler on collection is fired in venue list view @model.e_list.bind('add', @add_venue) • Handlers gets the venue view rendered and attaches it to the DOM add_venue: (venue_model) => venue_view = new VenueView( model: venue_model) tile_html = venue_view.render() $("#venue_col).append tile_html @akshaymathu 50
  • 51. Click on Venue Tile • Venue view registers click handler by defining event map class VenueView extends Backbone.View events: "click" : 'show_details’ • Venue detail popup is to be shown outside base element (el) of the venue view so it raises an event show_details: => ED.trigger ED.SHOW_VENUE, @model @akshaymathu 51
  • 52. Showing Details Popup • Page view listens to the event and renders details popup class PageView extends Backbone.View initialize: => ED.bind ED.SHOW_VENUE, @show_popup show_popup: (venue_model) => @detail_view = new VenueDetailView model: venue_model $(@el).append @detail_view.render() @akshaymathu 52
  • 54. Optimization • Venue model and Venue detail model represent exactly same entity – There is always 1-1 relation • Same model may be used for both – First render should not be slow for bringing details @akshaymathu 54