Slide 1

Slide 1 text

Backbone.js Rails 3.2 & with Handlebars

Slide 2

Slide 2 text

@whazzmaster

Slide 3

Slide 3 text

Javascript MVC = SQUEE!

Slide 4

Slide 4 text

Step One Angular.js Knockout.js Backbone.js Ember.js Serenade.js Batman.js Sammy.js Cappuccino Spine.js Sproutcore 1.x SHAZAM.js GWT

Slide 5

Slide 5 text

Dust Mustache.js Underscore.js JavaScript Micro-Templating Handlebars.js Hogan.js BabaJS Chain.js Step Two jQote jSmart

Slide 6

Slide 6 text

ಠ_ಠ Step Three

Slide 7

Slide 7 text

Rails 3.2 Backbone.js Handlebars One Option

Slide 8

Slide 8 text

Todo...

Slide 9

Slide 9 text

C’mon, bring your green hat

Slide 10

Slide 10 text

★Useful gems and libraries! ★Backbone model relationships! ★Off on the right foot! ★Use Handlebars for template!

Slide 11

Slide 11 text

GEMS! backbone-on-rails https://github.com/meleyal/backbone-on-rails ➡Vendors latest backbone + underscore ➡Includes useful generators ➡Nice naming conventions

Slide 12

Slide 12 text

GEMS! handlebars_assets https://github.com/leshill/handlebars_assets ➡Vendors latest handlebars version ➡Integrates with asset pipeline ➡Automatic inclusion in JST hash

Slide 13

Slide 13 text

/javascripts application.js /collections /models /routers /templates /views my_app.js.coffee Application skeleton

Slide 14

Slide 14 text

my_app.js.coffee #= require_self #= require_tree ./routers #= require_tree ./templates #= require_tree ./models #= require_tree ./collections #= require_tree ./views window.MyApp = Models: {} Collections: {} Views: {} Routers: {} init: (options) -> @router = new MyApp.Routers.MainRouter(options) Backbone.history.start()

Slide 15

Slide 15 text

My Foo has many Bars! HALP

Slide 16

Slide 16 text

LIBRARIES! Backbone-relational https://github.com/PaulUithol/Backbone-relational ➡Define model relationships in JS ➡Relationship-based events ➡Load all or partial subcollections

Slide 17

Slide 17 text

Phone Book Person Phone Number Phone Number Phone Number

Slide 18

Slide 18 text

models/person.js.coffee class MyApp.Models.Person extends Backbone.RelationalModel relations: [{ type: Backbone.HasMany, key: "phone_numbers", relatedModel: "MyApp.Models.PhoneNumber", collectionType: "MyApp.Collections.PhoneNumbersCollection", reverseRelation: { key: "person" } }] defaults: first_name: null last_name: null url: -> "/people/"+@get("id")+".json"

Slide 19

Slide 19 text

models/phone_number.js.coffee class MyApp.Models.PhoneNumber extends Backbone.RelationalModel defaults: label: null number: null url: -> if @isNew() "/people/"+@get("person_id")+"/phone_numbers.json" else "/people/"+@get("person_id")+"/phone_numbers/"+@get("id")+".json"

Slide 20

Slide 20 text

Congratulations! Your models are now in a relationship ★ fetchRelated to get sub-collections ★ add, remove, and update events exposed ★ traverse from parent to child or vice-versa

Slide 21

Slide 21 text

ADVICE (IANA***)

Slide 22

Slide 22 text

Carefully choose workflows to javascriptize

Slide 23

Slide 23 text

Start with an ‘app’ container view

Slide 24

Slide 24 text

Work outside in and refactor once things work

Slide 25

Slide 25 text

Then aggressively reduce complexity, per-view

Slide 26

Slide 26 text

Look for ‘widgetizable’ views

Slide 27

Slide 27 text

Prefer event-binding to overloading a view’s render method antipattern: your render method invokes a bunch of jQuery calls

Slide 28

Slide 28 text

Handleba

Slide 29

Slide 29 text

{{first_name}} {{last_name}}

    {{#each phone_numbers}}
  • {{label}}: {{number}}
  • {{/each}}
templates/people/show.jst.hbs MyApp.Views.People ||= {} class MyApp.Views.People.ShowView extends Backbone.View template: JST["templates/people/show"] tagName: 'div' views/people/show_view.js.coffee

Slide 30

Slide 30 text

Thank you

Slide 31

Slide 31 text

Zachery Moneypenny @whazzmaster code at github.com/whazzmaster slides at whazzmaster.github.com