SlideShare une entreprise Scribd logo
1  sur  30
Javascript MV*
 frameworks
  Kerry Buckley, FE Suffolk 27/8/12
MV*
Features
Client-server model
synchronisation
Event
handling
View templates
URL
routing
UI element
binding
che ibili ||b,n. nlineB HTML=" lay="" h="0" emoveC null;r place
 ild. {vis                       i                                 t        r
                 ,n=m m=1,k. a.inner le.disp yle.wid ="",n. =j=a=i m()).r ;ret
                                                                                      =           e
        =      )
 "),p hild(a e.zoo         = 2), 0].sty ),j.st erHTML =g=h=m h.rando pando] f((
 p endC a.styl Width!= =0,q[ "div"                 o .inn ]=u;o=l ry+Mat :a[f.e pando; [l
                                                                                          x          i
 li  ne", offset ight== ement( )===0), bles"                      jque pando]] ]&&f.ex on")e?k ?i
        =a. fsetHe eateEl 0)||0 +"Bub +(f.fn. .ex
 ocks ].of            r        , 1         [ t        "          [ f       p ando "functi eturn h c
       0
    q[ e&&(j   =c.c nRight on"),k "jQuery cache[a :a[f.ex c==                           ts;r urn;if( h
u= yl            argi "functi pando: ype?f. pando] |typeo g].eve )ret
                                                                            f         n




                Show me
 e dSt :0}).m ]==                x            T         x         |          [         ]          h [i]:
        h t     [ s     d :0,e =a.node j?a[f.e object" i[g]&&i if(!h[i elete ):b[
 nRig ypeof a {},uui a){a               a ,l= f c==" eturn pando; |h!=a?d expando ret
),  u=t cache: ction( cache: ypeo                   c])r o]:f.ex xpando| bute(f. )];if(b is[
                                                                                                     )
     nd({ ata:fun ,k=j?f. ));if(t s"&&!i[ pand                                                       h
xte asD            e         p           t         x          l eteE veAttri erCase( data(t ,d[
    ,h nodeTyp N=f.noo =="even g?b[f.e port.de remo
 0} a.                                                                                    .
                                                                           oLow h){d=f is[0],g hi
       =       JSO ;if(c= e:b,i= ;f.sup bute?b. eName.t engt
, i,j [l].to =d)              h            ]         i         d         . l        , k(th =b){d=t ?
      (k e(c)] g?f.cac =h[i][e oveAttr ta[a.no f(this ng(5)) (c==
   || as                                                                                           j[1]
 j       C       ,h= }var k :b.rem f.noDa ed"){i substri :"";if d===b&& eDat
c amel odeType turn        n do] var b= ndefin ase(g. ."+j[1] eturn                           hang c,b
   =b.n [i]))re [f.expa ame){                                                           r("c a(a,




                the code!
                                              "u
                                         a== .came =j   lC [1]?"             ;r       e
 g       h       b        N           f                              a ,d)) rHandl f.dat ),m(c
  (!l( delete (a.node (typeo &&(g=f );j[1] is[0], igge                                (           0
f       ?       f       i f           0          "        t h        t r         a,c, a(c,e,! (d));
 ando on(a){i =null; a-")=== plit(". ),d=k( ,c),b. f.data( eDat                              push d.ca
                d                                a         a         ,
u ncti ){var Of("dat r j=a.s is[0], a(this, "mark" f.remov ,!0):e. s"),
     a,c index });va ata(th f.dat "fx")+ !0):( ay(d) rogres );if(c=
on( ,g.                                                        ,         r
       e       s,a) (d=f.d "!",d), c=(c|| (c,e,g makeAr t("inp a="fx" turn
.nam ata(thi th&&                           (         a         .          f
                         [1]+ c){a&& ?f.dat (a,c,f c.unshi "&&(c=a n(a){r ){f.d
                                                                                     ,           e
               g
 {f.d is.len Data"+j n(a,              - 1;g f.data fx"&& tring unctio ction( a||
 b &&th r("set functio !0)||1) d)?e=               b ===" f a!="s queue:f ut(fun a=b),a= [g]
 Ha ndle _mark: c,e,b, Array( )),d&&( typeo                                    o
                                                                },de etTime &&(c=a, .data(e (?
                                                              )
      nd({ f.data( e||f.is shift( (a,c){ is,a)} is;s
 xte 0:(                                                                   ing" !0))&&f i,s=/^a :f
                              .            n        h           h        r
       ?      &&(! &&(d=c unctio ueue(t var c=t a!="st k,b,                                /          r
,g=a b,!0);d ess"              f           q        {                     ,         ea)$ nd({att th
              r         eue: "&&f.de tion() }typeof ta(e[g] |textar xte
      ,
a,c inprog nd({qu ess                      c        )          a         t         . e         c ess( va
      =" .exte progr               b ,fun (e,[e] )||f.d |selec w;f.fn n f.ac (a){
d== .fn                     eue( With            b,!0
                "i  n   qu                                 ject       /,v,      etur        tion       (o
Models

window.Todo = Backbone.Model.extend({
  idAttribute: "_id",

  defaults: function() {
     return {
        done: false,
        order: Todos.nextOrder()
     };
  },

  toggle: function() {
    this.save({done: !this.get("done")});
  }
});
Collections

window.TodoList = Backbone.Collection.extend({
  model: Todo,
  url: '/api/todos',

  done: function() {
     return this.filter(function(todo){
       return todo.get('done');
     });
  },

  remaining: function() {
    return this.without.apply(this, this.done());
  }
});
Client-server sync
get '/api/:thing' do
  DB.collection(params[:thing]).find.to_a.map{|t| from_bson_id(t)}.to_json
end

get '/api/:thing/:id' do
  from_bson_id(DB.collection(params[:thing]).find_one(to_bson_id(params[:id]))).to_json
end

post '/api/:thing' do
  oid = DB.collection(params[:thing]).insert(JSON.parse(request.body.read.to_s))
  "{"_id": "#{oid.to_s}"}"
end

delete '/api/:thing/:id' do
  DB.collection(params[:thing]).remove('_id' => to_bson_id(params[:id]))
end

put '/api/:thing/:id' do
  DB.collection(params[:thing]).update({'_id' => to_bson_id(params[:id])},
    {'$set' => JSON.parse(request.body.read.to_s).reject{|k,v| k == '_id'}})
end

def to_bson_id(id) BSON::ObjectId.from_string(id) end
def from_bson_id(obj) obj.merge({'_id' => obj['_id'].to_s}) end
Views & events
window.TodoView = Backbone.View.extend({
  tagName: "li",
  template: _.template($('#item-template').html()),
  events: {
     "click .check"             : "toggleDone",
     "dblclick div.todo-text"   : "edit",
     "click span.todo-destroy"  : "clear",
     "keypress .todo-input"     : "updateOnEnter"
  },

 initialize: function() {
    this.model.bind('change', this.render, this);
    this.model.bind('destroy', this.remove, this);
 },

 render: function() {
    $(this.el).html(this.template(this.model.toJSON()));
    this.setText();
    return this;
 },

 toggleDone: function() {
    this.model.toggle();
 },

 edit: function() {
    $(this.el).addClass("editing");
    this.input.focus();
 },

  // ...
});
View templates

<script id="item-template" type="text/template">
  <div class="todo <%= done ? 'done' : '' %>">
  <div class="display">
    <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> />
    <div class="todo-text"></div>
    <span id="todo-destroy"></span>
  </div>
  <div class="edit">
    <input class="todo-input" type="text" value="" />
  </div>
  </div>
</script>
URL routing
var Workspace = Backbone.Router.extend({
  routes: {
     "help":                 "help",   // #help
     "search/:query":        "search", // #search/kiwis
     "search/:query/p:page": "search"  // #search/kiwis/p7
  },

  help: function() {
     ...
  },

  search: function(query, page) {
    ...
  }
});
UI element binding
UI element binding

<form action="#">
  New item:

  <input />

  <button type="submit">Add</button>

  <p>Your items:</p>

  <select multiple="multiple">
  </select>
</form>
UI element binding

<form action="#" data-bind="submit: addItem">
  New item:

  <input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' />

  <button type="submit"
    data-bind="enable: itemToAdd().length > 0">Add</button>

  <p>Your items:</p>

  <select multiple="multiple" data-bind="options: items">
  </select>
</form>
UI element binding

var SimpleListModel = function(items) {
    this.items = ko.observableArray(items);

     this.itemToAdd = ko.observable("");

     this.addItem = function() {
         if (this.itemToAdd() !== "") {
             this.items.push(this.itemToAdd());
             this.itemToAdd("");
         }
     }.bind(this);
};

ko.applyBindings(new SimpleListModel(["Alpha", "Beta", "Gamma"]));
Any
questions
Image credits
•   http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

•   http://www.flickr.com/photos/anhonorablegerman/6133053209

•   http://www.flickr.com/photos/ksayer/5614813544

•   http://www.flickr.com/photos/camafghanistancam/4905314342

•   http://www.flickr.com/photos/duncan/4222224278

•   http://www.flickr.com/photos/scissorhands33/3430164569

•   http://www.flickr.com/photos/patlet/53104695

•   http://www.flickr.com/photos/omcoc/6751047205

Contenu connexe

Tendances

Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeStripe
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 
Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Peter Meyer
 
WordPressでIoTをはじめよう
WordPressでIoTをはじめようWordPressでIoTをはじめよう
WordPressでIoTをはじめようYuriko IKEDA
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnMasashi Shibata
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)jeffz
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2Takahiro Inoue
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤Takahiro Inoue
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUIAdam Lu
 
Webinar: What's New in Aggregation
Webinar: What's New in AggregationWebinar: What's New in Aggregation
Webinar: What's New in AggregationMongoDB
 
Groovy collection api
Groovy collection apiGroovy collection api
Groovy collection apitrygvea
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScriptniklal
 
The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202Mahmoud Samir Fayed
 
ggtimeseries-->ggplot2 extensions
ggtimeseries-->ggplot2 extensions ggtimeseries-->ggplot2 extensions
ggtimeseries-->ggplot2 extensions Dr. Volkan OBAN
 
The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196Mahmoud Samir Fayed
 
The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202Mahmoud Samir Fayed
 

Tendances (20)

Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018
 
WordPressでIoTをはじめよう
WordPressでIoTをはじめようWordPressでIoTをはじめよう
WordPressでIoTをはじめよう
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUI
 
teste
testeteste
teste
 
Webinar: What's New in Aggregation
Webinar: What's New in AggregationWebinar: What's New in Aggregation
Webinar: What's New in Aggregation
 
Oh Composable World!
Oh Composable World!Oh Composable World!
Oh Composable World!
 
Groovy collection api
Groovy collection apiGroovy collection api
Groovy collection api
 
Millionways
MillionwaysMillionways
Millionways
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScript
 
The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202
 
ggtimeseries-->ggplot2 extensions
ggtimeseries-->ggplot2 extensions ggtimeseries-->ggplot2 extensions
ggtimeseries-->ggplot2 extensions
 
The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196
 
The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202
 

En vedette

Testing http calls with Webmock and VCR
Testing http calls with Webmock and VCRTesting http calls with Webmock and VCR
Testing http calls with Webmock and VCRKerry Buckley
 
Adastral Park code retreat introduction
Adastral Park code retreat introductionAdastral Park code retreat introduction
Adastral Park code retreat introductionKerry Buckley
 
Single Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupSingle Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupEyal Golan
 

En vedette (7)

TDD refresher
TDD refresherTDD refresher
TDD refresher
 
BDD with cucumber
BDD with cucumberBDD with cucumber
BDD with cucumber
 
7li7w devcon5
7li7w devcon57li7w devcon5
7li7w devcon5
 
Testing http calls with Webmock and VCR
Testing http calls with Webmock and VCRTesting http calls with Webmock and VCR
Testing http calls with Webmock and VCR
 
Adastral Park code retreat introduction
Adastral Park code retreat introductionAdastral Park code retreat introduction
Adastral Park code retreat introduction
 
Jasmine
JasmineJasmine
Jasmine
 
Single Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupSingle Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance Meetup
 

Similaire à Javasccript MV* frameworks

Go: It's Not Just For Google
Go: It's Not Just For GoogleGo: It's Not Just For Google
Go: It's Not Just For GoogleEleanor McHugh
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscationguest9006ab
 
Data Structures Using C Practical File
Data Structures Using C Practical File Data Structures Using C Practical File
Data Structures Using C Practical File Rahul Chugh
 
Python 101 language features and functional programming
Python 101 language features and functional programmingPython 101 language features and functional programming
Python 101 language features and functional programmingLukasz Dynowski
 
Daapracticals 111105084852-phpapp02
Daapracticals 111105084852-phpapp02Daapracticals 111105084852-phpapp02
Daapracticals 111105084852-phpapp02Er Ritu Aggarwal
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meetMario Fusco
 
design and analysis of algorithm Lab files
design and analysis of algorithm Lab filesdesign and analysis of algorithm Lab files
design and analysis of algorithm Lab filesNitesh Dubey
 
Cbgapi 002
Cbgapi 002Cbgapi 002
Cbgapi 002kmilo1_7
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語ikdysfm
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」Ken'ichi Matsui
 
C tech questions
C tech questionsC tech questions
C tech questionsvijay00791
 
Artificial intelligence
Artificial intelligenceArtificial intelligence
Artificial intelligenceAditya Sharma
 

Similaire à Javasccript MV* frameworks (20)

ADA FILE
ADA FILEADA FILE
ADA FILE
 
Go: It's Not Just For Google
Go: It's Not Just For GoogleGo: It's Not Just For Google
Go: It's Not Just For Google
 
Blocks+gcd入門
Blocks+gcd入門Blocks+gcd入門
Blocks+gcd入門
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscation
 
Data Structures Using C Practical File
Data Structures Using C Practical File Data Structures Using C Practical File
Data Structures Using C Practical File
 
Python 101 language features and functional programming
Python 101 language features and functional programmingPython 101 language features and functional programming
Python 101 language features and functional programming
 
Daapracticals 111105084852-phpapp02
Daapracticals 111105084852-phpapp02Daapracticals 111105084852-phpapp02
Daapracticals 111105084852-phpapp02
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
 
F(1)
F(1)F(1)
F(1)
 
TRICK
TRICKTRICK
TRICK
 
design and analysis of algorithm Lab files
design and analysis of algorithm Lab filesdesign and analysis of algorithm Lab files
design and analysis of algorithm Lab files
 
C programs
C programsC programs
C programs
 
Python
PythonPython
Python
 
Scala best practices
Scala best practicesScala best practices
Scala best practices
 
Cbgapi 002
Cbgapi 002Cbgapi 002
Cbgapi 002
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
C++ programs
C++ programsC++ programs
C++ programs
 
C tech questions
C tech questionsC tech questions
C tech questions
 
Artificial intelligence
Artificial intelligenceArtificial intelligence
Artificial intelligence
 

Plus de Kerry Buckley

Ruby nooks & crannies
Ruby nooks & cranniesRuby nooks & crannies
Ruby nooks & cranniesKerry Buckley
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test communityKerry Buckley
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)Kerry Buckley
 
MongoMapper lightning talk
MongoMapper lightning talkMongoMapper lightning talk
MongoMapper lightning talkKerry Buckley
 
The secret life of bees
The secret life of beesThe secret life of bees
The secret life of beesKerry Buckley
 
Background processing
Background processingBackground processing
Background processingKerry Buckley
 
Katas, Contests and Coding Dojos
Katas, Contests and Coding DojosKatas, Contests and Coding Dojos
Katas, Contests and Coding DojosKerry Buckley
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless WorkingKerry Buckley
 
Software Development Trends
Software Development TrendsSoftware Development Trends
Software Development TrendsKerry Buckley
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless WorkingKerry Buckley
 
Behaviour-Driven Development
Behaviour-Driven DevelopmentBehaviour-Driven Development
Behaviour-Driven DevelopmentKerry Buckley
 
REST: putting the web back in to web services
REST: putting the web back in to web servicesREST: putting the web back in to web services
REST: putting the web back in to web servicesKerry Buckley
 

Plus de Kerry Buckley (20)

Ruby nooks & crannies
Ruby nooks & cranniesRuby nooks & crannies
Ruby nooks & crannies
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
 
Functional ruby
Functional rubyFunctional ruby
Functional ruby
 
MongoMapper lightning talk
MongoMapper lightning talkMongoMapper lightning talk
MongoMapper lightning talk
 
Ruby
RubyRuby
Ruby
 
Cloud
CloudCloud
Cloud
 
The secret life of bees
The secret life of beesThe secret life of bees
The secret life of bees
 
Background processing
Background processingBackground processing
Background processing
 
Katas, Contests and Coding Dojos
Katas, Contests and Coding DojosKatas, Contests and Coding Dojos
Katas, Contests and Coding Dojos
 
Rack
RackRack
Rack
 
Doing REST Right
Doing REST RightDoing REST Right
Doing REST Right
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
 
Software Development Trends
Software Development TrendsSoftware Development Trends
Software Development Trends
 
TDD
TDDTDD
TDD
 
Kanban and Iterationless Working
Kanban and Iterationless WorkingKanban and Iterationless Working
Kanban and Iterationless Working
 
TDD, BDD and mocks
TDD, BDD and mocksTDD, BDD and mocks
TDD, BDD and mocks
 
Behaviour-Driven Development
Behaviour-Driven DevelopmentBehaviour-Driven Development
Behaviour-Driven Development
 
REST: putting the web back in to web services
REST: putting the web back in to web servicesREST: putting the web back in to web services
REST: putting the web back in to web services
 
Git
GitGit
Git
 

Dernier

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Dernier (20)

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

Javasccript MV* frameworks

  • 1. Javascript MV* frameworks Kerry Buckley, FE Suffolk 27/8/12
  • 2.
  • 3.
  • 4. MV*
  • 5.
  • 6.
  • 13. che ibili ||b,n. nlineB HTML=" lay="" h="0" emoveC null;r place ild. {vis i t r ,n=m m=1,k. a.inner le.disp yle.wid ="",n. =j=a=i m()).r ;ret = e = ) "),p hild(a e.zoo = 2), 0].sty ),j.st erHTML =g=h=m h.rando pando] f(( p endC a.styl Width!= =0,q[ "div" o .inn ]=u;o=l ry+Mat :a[f.e pando; [l x i li ne", offset ight== ement( )===0), bles" jque pando]] ]&&f.ex on")e?k ?i =a. fsetHe eateEl 0)||0 +"Bub +(f.fn. .ex ocks ].of r , 1 [ t " [ f p ando "functi eturn h c 0 q[ e&&(j =c.c nRight on"),k "jQuery cache[a :a[f.ex c== ts;r urn;if( h u= yl argi "functi pando: ype?f. pando] |typeo g].eve )ret f n Show me e dSt :0}).m ]== x T x | [ ] h [i]: h t [ s d :0,e =a.node j?a[f.e object" i[g]&&i if(!h[i elete ):b[ nRig ypeof a {},uui a){a a ,l= f c==" eturn pando; |h!=a?d expando ret ), u=t cache: ction( cache: ypeo c])r o]:f.ex xpando| bute(f. )];if(b is[ ) nd({ ata:fun ,k=j?f. ));if(t s"&&!i[ pand h xte asD e p t x l eteE veAttri erCase( data(t ,d[ ,h nodeTyp N=f.noo =="even g?b[f.e port.de remo 0} a. . oLow h){d=f is[0],g hi = JSO ;if(c= e:b,i= ;f.sup bute?b. eName.t engt , i,j [l].to =d) h ] i d . l , k(th =b){d=t ? (k e(c)] g?f.cac =h[i][e oveAttr ta[a.no f(this ng(5)) (c== || as j[1] j C ,h= }var k :b.rem f.noDa ed"){i substri :"";if d===b&& eDat c amel odeType turn n do] var b= ndefin ase(g. ."+j[1] eturn hang c,b =b.n [i]))re [f.expa ame){ r("c a(a, the code! "u a== .came =j lC [1]?" ;r e g h b N f a ,d)) rHandl f.dat ),m(c (!l( delete (a.node (typeo &&(g=f );j[1] is[0], igge ( 0 f ? f i f 0 " t h t r a,c, a(c,e,! (d)); ando on(a){i =null; a-")=== plit(". ),d=k( ,c),b. f.data( eDat push d.ca d a a , u ncti ){var Of("dat r j=a.s is[0], a(this, "mark" f.remov ,!0):e. s"), a,c index });va ata(th f.dat "fx")+ !0):( ay(d) rogres );if(c= on( ,g. , r e s,a) (d=f.d "!",d), c=(c|| (c,e,g makeAr t("inp a="fx" turn .nam ata(thi th&& ( a . f [1]+ c){a&& ?f.dat (a,c,f c.unshi "&&(c=a n(a){r ){f.d , e g {f.d is.len Data"+j n(a, - 1;g f.data fx"&& tring unctio ction( a|| b &&th r("set functio !0)||1) d)?e= b ===" f a!="s queue:f ut(fun a=b),a= [g] Ha ndle _mark: c,e,b, Array( )),d&&( typeo o },de etTime &&(c=a, .data(e (? ) nd({ f.data( e||f.is shift( (a,c){ is,a)} is;s xte 0:( ing" !0))&&f i,s=/^a :f . n h h r ? &&(! &&(d=c unctio ueue(t var c=t a!="st k,b, / r ,g=a b,!0);d ess" f q { , ea)$ nd({att th r eue: "&&f.de tion() }typeof ta(e[g] |textar xte , a,c inprog nd({qu ess c ) a t . e c ess( va =" .exte progr b ,fun (e,[e] )||f.d |selec w;f.fn n f.ac (a){ d== .fn eue( With b,!0 "i n qu ject /,v, etur tion (o
  • 14.
  • 15.
  • 16.
  • 17.
  • 18. Models window.Todo = Backbone.Model.extend({ idAttribute: "_id", defaults: function() { return { done: false, order: Todos.nextOrder() }; }, toggle: function() { this.save({done: !this.get("done")}); } });
  • 19. Collections window.TodoList = Backbone.Collection.extend({ model: Todo, url: '/api/todos', done: function() { return this.filter(function(todo){ return todo.get('done'); }); }, remaining: function() { return this.without.apply(this, this.done()); } });
  • 20. Client-server sync get '/api/:thing' do DB.collection(params[:thing]).find.to_a.map{|t| from_bson_id(t)}.to_json end get '/api/:thing/:id' do from_bson_id(DB.collection(params[:thing]).find_one(to_bson_id(params[:id]))).to_json end post '/api/:thing' do oid = DB.collection(params[:thing]).insert(JSON.parse(request.body.read.to_s)) "{"_id": "#{oid.to_s}"}" end delete '/api/:thing/:id' do DB.collection(params[:thing]).remove('_id' => to_bson_id(params[:id])) end put '/api/:thing/:id' do DB.collection(params[:thing]).update({'_id' => to_bson_id(params[:id])}, {'$set' => JSON.parse(request.body.read.to_s).reject{|k,v| k == '_id'}}) end def to_bson_id(id) BSON::ObjectId.from_string(id) end def from_bson_id(obj) obj.merge({'_id' => obj['_id'].to_s}) end
  • 21. Views & events window.TodoView = Backbone.View.extend({ tagName: "li", template: _.template($('#item-template').html()), events: { "click .check" : "toggleDone", "dblclick div.todo-text" : "edit", "click span.todo-destroy" : "clear", "keypress .todo-input" : "updateOnEnter" }, initialize: function() { this.model.bind('change', this.render, this); this.model.bind('destroy', this.remove, this); }, render: function() { $(this.el).html(this.template(this.model.toJSON())); this.setText(); return this; }, toggleDone: function() { this.model.toggle(); }, edit: function() { $(this.el).addClass("editing"); this.input.focus(); }, // ... });
  • 22. View templates <script id="item-template" type="text/template"> <div class="todo <%= done ? 'done' : '' %>"> <div class="display"> <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> /> <div class="todo-text"></div> <span id="todo-destroy"></span> </div> <div class="edit"> <input class="todo-input" type="text" value="" /> </div> </div> </script>
  • 23. URL routing var Workspace = Backbone.Router.extend({ routes: { "help": "help", // #help "search/:query": "search", // #search/kiwis "search/:query/p:page": "search" // #search/kiwis/p7 }, help: function() { ... }, search: function(query, page) { ... } });
  • 24.
  • 26. UI element binding <form action="#"> New item: <input /> <button type="submit">Add</button> <p>Your items:</p> <select multiple="multiple"> </select> </form>
  • 27. UI element binding <form action="#" data-bind="submit: addItem"> New item: <input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' /> <button type="submit" data-bind="enable: itemToAdd().length > 0">Add</button> <p>Your items:</p> <select multiple="multiple" data-bind="options: items"> </select> </form>
  • 28. UI element binding var SimpleListModel = function(items) { this.items = ko.observableArray(items); this.itemToAdd = ko.observable(""); this.addItem = function() { if (this.itemToAdd() !== "") { this.items.push(this.itemToAdd()); this.itemToAdd(""); } }.bind(this); }; ko.applyBindings(new SimpleListModel(["Alpha", "Beta", "Gamma"]));
  • 30. Image credits • http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx • http://www.flickr.com/photos/anhonorablegerman/6133053209 • http://www.flickr.com/photos/ksayer/5614813544 • http://www.flickr.com/photos/camafghanistancam/4905314342 • http://www.flickr.com/photos/duncan/4222224278 • http://www.flickr.com/photos/scissorhands33/3430164569 • http://www.flickr.com/photos/patlet/53104695 • http://www.flickr.com/photos/omcoc/6751047205

Notes de l'éditeur

  1. \n
  2. Some expectation-setting: this is a master.\n
  3. This is me.\n
  4. C might be controller or collection.\nMore similar than they are different\n
  5. Rich or single page web apps. Just JQuery can become messy.\nTight coupling between app and DOM is bad.\n
  6. \n
  7. \n
  8. \n
  9. Associate page events with actions on your models\n
  10. HTML views for each page element. Bind to attributes\n
  11. Allows bookmarking (hashbangs or history API)\n
  12. Automatic updating of elements on page when model changes, and vice versa.\n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. Sinatra app (Rails would be simpler). Methods on model and collection automatically make AJAX calls.\n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n