Webapplikationen mit Backbone.js

55
Sebastian Springer @basti_springer Wednesday, June 26, 13

description

 

Transcript of Webapplikationen mit Backbone.js

Page 1: Webapplikationen mit Backbone.js

Sebastian Springer@basti_springer

Wednesday, June 26, 13

Page 2: Webapplikationen mit Backbone.js

WER BIN ICH?

• Sebastian Springer

• https://github.com/sspringer82

• @basti_springer

• Teamlead @ Mayflower

Wednesday, June 26, 13

Page 3: Webapplikationen mit Backbone.js

THEMEN• require.js

• Bootstrap - das von Twitter...

• Backbone.js

• Router

• Model

• View

• Collection

Wednesday, June 26, 13

Page 4: Webapplikationen mit Backbone.js

DIE AUFGABE

• Filmdatenbank

• CRUD

• Single Page Appliakation

• AMD Modulloader

• Layout

Wednesday, June 26, 13

Page 5: Webapplikationen mit Backbone.js

Wednesday, June 26, 13

Page 6: Webapplikationen mit Backbone.js

Wednesday, June 26, 13

Page 7: Webapplikationen mit Backbone.js

AUFBAU

Wednesday, June 26, 13

Page 8: Webapplikationen mit Backbone.js

AUFBAU

require.js

backbone.js Bootstrap

jQuerylodash

Wednesday, June 26, 13

Page 9: Webapplikationen mit Backbone.js

public/!"" img!"" js#   !"" app#   #   !"" app.js#   #   !"" config.js#   #   !"" main.js#   #   !"" router.js#   #   !"" text.js#   #   !"" models#   #   $"" views#   $"" lib#   !"" backbone-min.js#   !"" bootstrap.min.js#   !"" jquery-1.9.1.min.js#   !"" lodash.min.js#   $"" require.js$"" style

Wednesday, June 26, 13

Page 10: Webapplikationen mit Backbone.js

INDEX.HTMLDer Einstieg

Wednesday, June 26, 13

Page 11: Webapplikationen mit Backbone.js

<!DOCTYPE html>

<html><head> <link rel="stylesheet" type="text/css" href="/style/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/style/style.css"></head><body>

<div class="text-right"> <a id="logout" href="/logout"><i class="icon-off"></i></a></div>

<div id="main"></div>

<a id="newMovie"> <i class="icon-file"></i><span>neuen Film anlegen</span></a>

<script data-main="/js/app/config" src="/js/lib/require.js"></script>

<script>var data = ...</script>

</body></html>Wednesday, June 26, 13

Page 12: Webapplikationen mit Backbone.js

<!DOCTYPE html>

<html><head> <link rel="stylesheet" type="text/css" href="/style/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/style/style.css"></head><body>

<div class="text-right"> <a id="logout" href="/logout"><i class="icon-off"></i></a></div>

<div id="main"></div>

<a id="newMovie"> <i class="icon-file"></i><span>neuen Film anlegen</span></a>

<script data-main="/js/app/config" src="/js/lib/require.js"></script>

<script>var data = ...</script>

</body></html>Wednesday, June 26, 13

Page 13: Webapplikationen mit Backbone.js

<!DOCTYPE html>

<html><head> <link rel="stylesheet" type="text/css" href="/style/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/style/style.css"></head><body>

<div class="text-right"> <a id="logout" href="/logout"><i class="icon-off"></i></a></div>

<div id="main"></div>

<a id="newMovie"> <i class="icon-file"></i><span>neuen Film anlegen</span></a>

<script data-main="/js/app/config" src="/js/lib/require.js"></script>

<script>var data = ...</script>

</body></html>Wednesday, June 26, 13

Page 14: Webapplikationen mit Backbone.js

MODULLOADER

Wednesday, June 26, 13

Page 15: Webapplikationen mit Backbone.js

MODULLOADER

• Keine <script>-Tags zum Laden

• Abhängigkeiten auflösen

• CommonJS Modules

Wednesday, June 26, 13

Page 16: Webapplikationen mit Backbone.js

MODULLOADER

define( “name”, [deps...], function (deps) { ... return x; });

Wednesday, June 26, 13

Page 17: Webapplikationen mit Backbone.js

APP/CONFIG.JSApplikationskonfiguration

Wednesday, June 26, 13

Page 18: Webapplikationen mit Backbone.js

require.config({ "deps": ["main"],

"paths": { "jquery": "../lib/jquery-1.9.1.min", ... },

"shim": { "backbone": { "deps": ["jquery","lodash"], "exports": "Backbone" },

"bootstrap": { "deps": ["jquery"] } }});

Wednesday, June 26, 13

Page 19: Webapplikationen mit Backbone.js

APP/MAIN.JSBootstrapping

Wednesday, June 26, 13

Page 20: Webapplikationen mit Backbone.js

require(["app", "router"], function (app, Router) { app.router = new Router();

Backbone.history.start( { pushState: true, root: app.root } );

app.router.navigate(app.root, {trigger: true});});

Wednesday, June 26, 13

Page 21: Webapplikationen mit Backbone.js

APP/APP.JSApplication Namespace

Wednesday, June 26, 13

Page 22: Webapplikationen mit Backbone.js

define(["backbone", "bootstrap"], function() { return { root: "/" };});

Wednesday, June 26, 13

Page 23: Webapplikationen mit Backbone.js

ROUTER

Wednesday, June 26, 13

Page 24: Webapplikationen mit Backbone.js

ROUTER

• Navigation innerhalb der Applikation

• Bookmark-Unterstützung

• Back Button-Unterstützung

• Voraussetzung: Backbone.history.start

Wednesday, June 26, 13

Page 25: Webapplikationen mit Backbone.js

APP/ROUTER.JSDer Router

Wednesday, June 26, 13

Page 26: Webapplikationen mit Backbone.js

define(["backbone", ...], function(Backbone, ...) { var Router = Backbone.Router.extend({ routes: { "": "index", "new": "addMovie", "edit/:id": "editMovie" },

index: function() {...},

addMovie: function () {...},

editMovie: function (id) {...} });

return Router;});

Wednesday, June 26, 13

Page 27: Webapplikationen mit Backbone.js

MODEL

Wednesday, June 26, 13

Page 28: Webapplikationen mit Backbone.js

MODEL

• Enthalten die Daten der Applikation

• Enthalten die Businesslogik der Applikation

• Validierung, Konvertierung, Zugriffsberechtigungen

• Kann REST

Wednesday, June 26, 13

Page 29: Webapplikationen mit Backbone.js

MODEL

• get()

• set()

• save()

• fetch()

• destroy()

• ...

• id

• cid

• urlRoot

Wednesday, June 26, 13

Page 30: Webapplikationen mit Backbone.js

APP/MODELS/MOVIE.JSDas Model

Wednesday, June 26, 13

Page 31: Webapplikationen mit Backbone.js

define("models/movie", ['backbone'], function (Backbone) {

"use strict";

return Backbone.Model.extend({

idAttribute: "id",

urlRoot: '/movie' });});

Wednesday, June 26, 13

Page 32: Webapplikationen mit Backbone.js

COLLECTION

Wednesday, June 26, 13

Page 33: Webapplikationen mit Backbone.js

COLLECTION

• Sammlung von Models

• Hilfsmethoden für z.B. Suche, Sortierung

Wednesday, June 26, 13

Page 34: Webapplikationen mit Backbone.js

COLLECTION

• add()

• remove()

• reset()

• fetch()

• get()

• model

• models

Wednesday, June 26, 13

Page 35: Webapplikationen mit Backbone.js

APP/MODELS/MOVIESDie Collection

Wednesday, June 26, 13

Page 36: Webapplikationen mit Backbone.js

define(['backbone', 'models/movie'], function (Backbone, Movie) {

return Backbone.Collection.extend({ model: Movie });});

Wednesday, June 26, 13

Page 37: Webapplikationen mit Backbone.js

VIEW

Wednesday, June 26, 13

Page 38: Webapplikationen mit Backbone.js

VIEW

• Darstellung der Daten der Models

• Displaylogik und Templates

• Templating mit Underscore Template

• HTML Template Einbindung mit dem require text-Plugin

Wednesday, June 26, 13

Page 39: Webapplikationen mit Backbone.js

VIEW

• render() • events

• el

• tagName

• className

• id

Wednesday, June 26, 13

Page 40: Webapplikationen mit Backbone.js

APP/VIEWS/MOVIE.JSDie View

Wednesday, June 26, 13

Page 41: Webapplikationen mit Backbone.js

define(['text!views/movie.html', 'app'], function (template, app) { return Backbone.View.extend({ tagName: 'tr', events: { "click .icon-trash": "remove", "click .icon-edit": "edit", "click .rating": "rate" }, initialize: function () { this.listenTo(this.model, "change", this.render); }, render: function () {...}, remove: function () {...}, edit: function () {...}, rate: function (e) {...} });});

Wednesday, June 26, 13

Page 42: Webapplikationen mit Backbone.js

APP/VIEWS/MOVIE.HTMLDas Template

Wednesday, June 26, 13

Page 43: Webapplikationen mit Backbone.js

<td><%= name %></td><td><%= year %></td><td><%= genre %></td><td class="rating"> <% if (rating >= 1) { %> <i class="icon-star r1"></i> <% } else { %> <i class="icon-star-empty r1"></i> <% } %>

...</td>

<td> <i class="icon-edit"></i> <i class="icon-trash"></i></td>

Wednesday, June 26, 13

Page 44: Webapplikationen mit Backbone.js

READ

Wednesday, June 26, 13

Page 45: Webapplikationen mit Backbone.js

READ

• Collection initialisieren - reset()

• Models mit Views verknüpfen

• Collection Template

• Models rendern

Wednesday, June 26, 13

Page 46: Webapplikationen mit Backbone.js

CREATE

Wednesday, June 26, 13

Page 47: Webapplikationen mit Backbone.js

CREATE

• Neue View & Template

• Neues Model erstellen

• Model mit View verbinden

• POST Anfrage an den Server

• In die Collection aufnehmen

Wednesday, June 26, 13

Page 48: Webapplikationen mit Backbone.js

UPDATE

Wednesday, June 26, 13

Page 49: Webapplikationen mit Backbone.js

UPDATE

• CREATE View verwenden

• Daten per PUT an den Server senden

• Anzeige aktualisieren

Wednesday, June 26, 13

Page 50: Webapplikationen mit Backbone.js

DELETE

Wednesday, June 26, 13

Page 51: Webapplikationen mit Backbone.js

DELETE

• Daten per DELETE-Anfrage löschen

• Knoten aus dem DOM entfernen

Wednesday, June 26, 13

Page 52: Webapplikationen mit Backbone.js

UND WIE GEHT ES WEITER?

Wednesday, June 26, 13

Page 53: Webapplikationen mit Backbone.js

UND WIE GEHT ES WEITER?

• Tests (Jasmine, Karma)

• Unittests

• E2E Tests

• Build (r.js)

• Minifying

• Combining

Wednesday, June 26, 13

Page 54: Webapplikationen mit Backbone.js

FRAGEN?

Wednesday, June 26, 13

Page 55: Webapplikationen mit Backbone.js

KONTAKT

Sebastian [email protected]

Mayflower GmbHMannhardtstr. 680538 MünchenDeutschland

@basti_springer

https://github.com/sspringer82

Wednesday, June 26, 13