SlideShare a Scribd company logo
applications: a series of states
a talk by @trek
<a href=”serialize/user/intent.fmt”>
GET https://simple.com/activity
GET https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba
GET https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba/edit
PUT https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba
HTTP 302 Found
GET https://simple.com/activity
!
http://imgs.xkcd.com/comics/regular_expressions.png
GET https://simple.com/activity
$('.some-selector').click(function(){
$.ajax({
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
$('.some-selector').click(function(){
$.ajax({
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
$('.some-button').click(function(){
$.ajax({
type: ‘post’,
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
decent, not great.
{}
truth-in-dom
JSON, js,
html
JSON, js,
html
{
vendor: 'Wholefds Kbs',
amount: '20.70',
isCredit: false,
isPending: true,
type: 'Groceries',
location: {
lat: '41.910006',
long: '87.657166',
address: '1070 N North Branch St,n
Chicago IL 60642'
}
}
success: function(purchase){
var sidebar = $('#more-info');
if(purchase.isPending) { $('.is-pending', sidebar).show(); }
$('.name', sidebar).html(purchase.vendor);
$('.amount', sidebar).html('-' + purchase.amount);
$('.category', sidebar).html(purchase.type);
$('.map', sidebar).gMapPlugin(purchase.location);
$('.address', sidebar).html(purchase.location.address);
}
success: function(purchase){
var sidebar = $('#more-info'), template = Templates.purchase;
sidebar.html(template(purchase));
$('.map', sidebar).gMapPlugin(purchase.location);
}
truth-in-dom
JSON, js,
html
JSON, js,
html
truth-in-dom
JSON, js,
html
truth-in-dom
JSON, js,
html
truth-in-dom
success: function(purchase){
var sidebar = $('#more-info'),
listItem = $(‘#list .purchase-’ + purchase.id),
purchaseTemplate = Templates.purchase.show,
purchaseTableRowTemplate = Templates.purchase.row;
sidebar.html(purchaseTemplate(purchase));
listItem.html(purchaseTableRowTemplate(purchase));
$('.map', sidebar).gMapPlugin(purchase.location);
}
<div id=”purchase-list”></div>
View
Collection of Models
View
View
View
View
View
View
View
Properties of the collection
<div id=”details”>
</div>
View
Aggregation of
Collection
Different View
Single Model
GET https://simple.com/activity
app.Purchase = Backbone.Model.extend();
app.PurchaseList = Backbone.Collection.extend({
model: app.Purchase
});
app.PurchaseList.url = ‘purchases’
app.Purchases = new app.PurchaseList;
app.PurchaseListView = Backbone.View.extend({
el: ‘#purchase-list’,
initialize: function(){
this.collection = app.Purchases;
this.collection.on('change', this.render, this)
this.render();
},
render: function(){
this.$el.append(new PurchasesFilterView().render());
_.each(this.collection.models, function (item) {
this.$el.append(new PurchaseRowView({model: item})
.render());
}, this);
}
});
app.PurchaseRowView = Backbone.View.extend({
initialize: function() {
this.model.on( 'change', this.render, this );
},
tagName: 'li',
template: ...,
events: {
'click': 'toggleMoreDetails', 'click .edit': 'toggleEdit'
},
toggleMoreDetails: function(){
this.model.toggleMoreDetails();
this.$el.toggleClass( 'selected', this.moreDetailsShowing);
},
render: function(){
this.$el.html(this.template(this.model))
}
});
app.PurchaseDetailsView = Backbone.View.extend({
el: ‘#details’,
initialize: function(){
this.render();
},
template: '...',
render: function(){
this.$el.html(this.template(this.model);
}
});
app.Purchases.fetch();
<div id=”purchase-list”></div>
render: function(){
this.$el.append(new PurchasesFilterView().render());
_.each(this.collection.models, function (item) {
this.$el.append(new PurchaseRowView({model: item})
.render());
}, this);
}
app.PurchaseRowView = Backbone.View.extend({
...
events: { 'click': 'toggleMoreDetails' },
toggleMoreDetails: function(){
this.model.toggleMoreDetails();
this.$el.toggleClass( 'selected', this.moreDetailsShowing);
}
});
truth-in-data
truth-in-datatruth-in-data
model.on(‘change’)/
collection.on(‘change’)
-> render
model.on(‘change’)
-> render
model.on(‘change’)
-> render
{}
<div id=”purchase-list”>
<div id=”details”>
</div>
<div id=”dashboard”>
</div>
<div id=”sidebar”>
</div>
<div id=”map”>
</div>
</div>
app.DashboardView = Backbone.View.extend({
render: function(){
this.$el.append(new app.PurchaesView().render().el);
this.$el.append(new app.PurchaesMapView().render().el);
this.$el.append(new app.PurcaseDetailView().render().el);
}
});
http://lostechies.com/derickbailey/2011/09/15/zombies-run-
managing-page-transitions-in-backbone-apps/
<div id=”purchase-list”>
<div id=”details”>
</div>
<div id=”dashboard”>
</div>
<div id=”sidebar”>
</div>
<div id=”map”>
</div>
</div>
possible, but you must be cautious
{{view App.NavigationView}}
{{view App.SummaryView}}
{{ outlet }}
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
App = Ember.Application.create();
App.ApplicationView = Ember.View.extend({
templateName: 'application'
});
App.ApplicationController = Ember.Controller.extend();
App.Router = Ember.Route.extend({
root: Ember.Route.extend({})
// this happens for you: ‘shared instance’
// applicationController: App.ApplicationController.create()
})
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
Purchases
Index Viewing Editing
App = Ember.Application.create();
App.ApplicationView = Ember.View.extend({
templateName: 'application'
});
App.ApplicationController = Ember.Controller.extend();
App.Router = Ember.Route.extend({
root: Ember.Route.extend({})
})
App = Ember.Application.create();
App.ApplicationView = Ember.View.extend({
templateName: 'application'
});
App.ApplicationController = Ember.Controller.extend();
App.Router = Ember.Route.extend({
root: Ember.Route.extend({
purchases: Ember.Route.extend({
index: Ember.Route.extend({
})
})
})
});
{{view App.NavigationView}}
{{view App.SummaryView}}
{{outlet mainArea}}
{{outlet detailsArea}}
application.handlebars
App = Ember.Application.create();
App.ApplicationView = Ember.View.extend({
templateName: 'application'
});
App.ApplicationController = Ember.Controller.extend();
App.Router = Ember.Route.extend({
root: Ember.Route.extend({
purchases: Ember.Route.extend({
index: Ember.Route.extend({
})
})
})
});
purchases: Ember.Route.extend({
index: Ember.Route.extend({
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
connectOutlets: function(router){
var controller = router.get('applicationController'),
purchases = App.Purchase.find(),
locations = purchases.get('locations');
controller.connectOutlet('mainArea', 'purchaseList', purchases);
controller.connectOutlet('detailsArea', 'map', locations);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
connectOutlets: function(router){
var controller = router.get('applicationController'),
purchases = App.Purchase.find(),
locations = purchases.get('locations');
controller.connectOutlet('mainArea', 'purchaseList', purchases);
controller.connectOutlet('detailsArea', 'map', locations);
}
})
})
where? what? data context?
controller.connectOutlet('mainArea', 'purchaseList', purchases);
controller.connectOutlet('mainArea', 'purchaseList', purchases);
App.PurchaseListView = Ember.View.extend({
templateName: 'purchaseList'
});
App.PurchaseListController = Ember.ArrayController.extend();
Ember.ArrayController.extend();
proxy/presenter/controller/thingie
proxy
content
proxy
content
what’s your length?
proxy
content
how are you sorted?
controller.connectOutlet('mainArea', 'purchaseList', purchases);
App.PurchaseListView = Ember.View.extend({
templateName: 'purchaseList'
});
App.PurchaseListController = Ember.ArrayController.extend();
controller.connectOutlet('mainArea', 'purchaseList', purchases);
App.PurchaseListView = Ember.View.extend({
templateName: 'purchaseList'
});
App.PurchaseListController = Ember.ArrayController.extend();
{{#each purchase in controller}}
<li>
{{purchase.date}}
{{purchase.location}}
{{purchase.amount}}
</li>
{{/each}}
controller.connectOutlet('mainArea', 'purchaseList', purchases);
App.PurchaseListView = Ember.View.extend({
templateName: 'purchaseList'
});
App.PurchaseListController = Ember.ArrayController.extend();
{{#each purchase in controller}}
<li>
{{purchase.date}}
{{purchase.location}}
{{purchase.amount}}
</li>
{{/each}}
purchases: Ember.Route.extend({
index: Ember.Route.extend({
connectOutlets: function(router){
var controller = router.get('applicationController'),
purchases = App.Purchase.find(),
locations = purchases.get('locations');
controller.connectOutlet('mainArea', 'purchaseList', purchases);
controller.connectOutlet('detailsArea', 'map', locations);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
connectOutlets: function(router){
var controller = router.get('applicationController'),
purchases = App.Purchase.find(),
locations = purchases.get('locations');
controller.connectOutlet('mainArea', 'purchaseList', purchases);
controller.connectOutlet('detailsArea', 'map', locations);
}
})
})
where? what? data context?
controller.connectOutlet('detailsArea', 'map', locations);
App.MapView = Ember.View.extend({
templateName: 'googleMap'
});
App.MapController = Ember.ArrayController.extend();
controller.connectOutlet('detailsArea', 'map', locations);
controller.connectOutlet('detailsArea', 'map', locations);
App.MapView = Ember.View.extend({
templateName: 'googleMap'
});
App.MapController = Ember.ArrayController.extend();
controller.connectOutlet('detailsArea', 'map', locations);
App.MapView = Ember.View.extend({
templateName: 'googleMap'
});
App.MapController = Ember.ArrayController.extend();
controller.connectOutlet('detailsArea', 'map', locations);
App.MapView = Ember.View.extend({
templateName: 'googleMap'
});
App.MapController = Ember.ArrayController.extend();
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
{{#each purchase in controller}}
<li>
{{purchase.date}}
{{purchase.location}}
{{purchase.amount}}
</li>
{{/each}}
{{#each purchase in controller}}
<li {{action showDetails purchase}}>
{{purchase.date}}
{{purchase.location}}
{{purchase.amount}}
</li>
{{/each}}
purchases: Ember.Route.extend({
index: Ember.Route.extend({
connectOutlets: function(router){
...
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
})
})
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
where? what? data context?
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
{{#each purchase in controller}}
<li {{action showDetails purchase}}>
{{purchase.date}}
{{purchase.location}}
{{purchase.amount}}
</li>
{{/each}}
controller.connectOutlet('detailsArea', 'purchaseDetails', context);
controller.connectOutlet('detailsArea', 'purchaseDetails', context);
App.PurchaseDetailsView = Ember.View.extend({
templateName: 'details'
});
App.PurchaseDetailsController = Ember.ObjectController.extend();
controller.connectOutlet('detailsArea', 'purchaseDetails', context);
App.PurchaseDetailsView = Ember.View.extend({
templateName: 'details'
});
App.PurchaseDetailsController = Ember.ObjectController.extend();
<div class='actions'>
<a {{action editPurchase content}}>
Edit
</a>
<a href='...'>Support</a>
</div>
{{#if pending}}
<h3>
This transaction is pending...
</h3>
{{/if}}
{{name}}
{{amount}}
{{label}}
App.PurchaseDetailsView = Ember.View.extend({
templateName: 'details'
});
App.PurchaseDetailsController = Ember.ObjectController.extend();
App.PurchaseDetailsView = Ember.View.extend({
templateName: 'details'
});
App.PurchaseDetailsController = Ember.ObjectController.extend();
<div class='actions'>
<a {{action editPurchase content}}>
Edit
</a>
<a href='...'>Support</a>
</div>
{{#if pending}}
<h3>
This transaction is pending...
</h3>
{{/if}}
{{name}}
{{amount}}
{{label}}
Ember.ObjectController.extend();
proxy
content
Ember.ObjectController.extend();
proxy
content
are you pending?
App.PurchaseDetailsView = Ember.View.extend({
templateName: 'details'
});
App.PurchaseDetailsController = Ember.ObjectController.extend();
<div class='actions'>
<a {{action editPurchase content}}>
Edit
</a>
<a href='...'>Support</a>
</div>
{{#if pending}}
<h3>
This transaction is pending...
</h3>
{{/if}}
{{name}}
{{amount}}
{{label}}
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
<div class='actions'>
<a {{action editPurchase content}}>
Edit
</a>
<a href='...'>Support</a>
</div>
{{#if pending}}
<h3>
This transaction is pending...
</h3>
{{/if}}
{{name}}
{{amount}}
{{label}}
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
viewing: Ember.Route.extend({
editPurchase: Ember.Route.transitionTo(‘editing’),
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
editing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'editPurchaseDetails', context);
}
}),
viewing: Ember.Route.extend({
editPurchase: Ember.Route.transitionTo(‘editing’),
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
editing: Ember.Route.extend({
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'editPurchaseDetails', context);
}
}),
viewing: Ember.Route.extend({
editPurchase: Ember.Route.transitionTo(‘editing’),
connectOutlets: function(router, context){
var controller = router.get('applicationController');
controller.
connectOutlet('detailsArea', 'purchaseDetails', context);
}
})
})
where? what? data context?
connectOutlet('detailsArea', 'editPurchaseDetails', context);
connectOutlet('detailsArea', 'editPurchaseDetails', context);
App.EditPurchaseDetailsView = Ember.View.extend({
templateName: 'edit-details'
});
App.EditPurchaseDetailsController = Ember.ObjectController.extend();
connectOutlet('detailsArea', 'editPurchaseDetails', context);
App.EditPurchaseDetailsView = Ember.View.extend({
templateName: 'edit-details'
});
App.EditPurchaseDetailsController = Ember.ObjectController.extend();
<a {{action save context}}>Save</a>
<a {{action cancel}}>Cancel</a>
{{view Ember.TextField
valueBinding="name"}}
connectOutlet('detailsArea', 'editPurchaseDetails', context);
App.EditPurchaseDetailsView = Ember.View.extend({
templateName: 'edit-details'
});
App.EditPurchaseDetailsController = Ember.ObjectController.extend();
<a {{action save context}}>Save</a>
<a {{action cancel}}>Cancel</a>
{{view Ember.TextField
valueBinding="name"}}
Ember.ObjectController.extend();
proxy
content
Ember.ObjectController.extend();
proxy
content
what’s your name?
Purchases
Index Viewing Editing
Purchases
Index Viewing Editing
purchases: Ember.Route.extend({
index: Ember.Route.extend({
showDetails: Ember.Route.transitionTo(‘viewing’),
connectOutlets: function(router){
...
}
}),
editing: Ember.Route.extend({
saveChanges: Ember.Route.transitionTo(‘index’),
connectOutlets: function(router, context){
...
}
}),
viewing: Ember.Route.extend({
editPurchase: Ember.Route.transitionTo(‘editing’),
connectOutlets: function(router, context){
...
})
})
Purchases
Index Viewing Editing
Demeter’d
https://gist.github.com/3981133
> 7 views
which pattern, when?
• app is just a series of documents
• or you’re just coding single page
• not a client app
• manipulation mostly presentational
• few data communications
• user interaction brief, simple, infrequent
• app is series of documents
• with “islands of richness”
• occassional data communications
• multiple parts of a page need to reflect data
• shallow view hierarchy (1-2 levels)
• small number of views (~7)
• user interaction brief and/or infrequent
• frequent data communications
• many parts of a page need to reflect data
• deep view hierarchy (2-3+)
• large number of views
• user will remain for large amounts of time
• and/or frequently return
• server is just an api
• you’d *almost* write a desktop/iOS app
Mobile
Cocoa Touch
Android SDK
Desktop
Cocoa
.NET
Web ?
Mobile
Cocoa Touch
Android SDK
Desktop
Cocoa
.NET
Web
User Interface HTML+CSS
Data Persistence
Application
Architecture
fin

More Related Content

What's hot

Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016
Codemotion
 
AngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.jsAngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.js
Mark
 
Single Page Web Apps with Backbone.js and Rails
Single Page Web Apps with Backbone.js and RailsSingle Page Web Apps with Backbone.js and Rails
Single Page Web Apps with Backbone.js and Rails
Prateek Dayal
 
Node.js server-side rendering
Node.js server-side renderingNode.js server-side rendering
Node.js server-side rendering
The Software House
 
How routing works in angular js
How routing works in angular jsHow routing works in angular js
How routing works in angular js
codeandyou forums
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorial
Claude Tech
 
Resource and view
Resource and viewResource and view
Resource and view
Papp Laszlo
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & REST
Robbert
 
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Codemotion
 
Ruby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 AjaxRuby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 Ajax
Wen-Tien Chang
 
Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017
Joke Puts
 
Upgrading from Angular 1.x to Angular 2.x
Upgrading from Angular 1.x to Angular 2.xUpgrading from Angular 1.x to Angular 2.x
Upgrading from Angular 1.x to Angular 2.x
Eyal Vardi
 
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Joke Puts
 
Session 2
Session 2Session 2
Session 2
alfador
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using RubyTesting ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
Ben Hall
 
19.imagini in laravel5
19.imagini in laravel519.imagini in laravel5
19.imagini in laravel5
Razvan Raducanu, PhD
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
Eyal Vardi
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
murtazahaveliwala
 
IndexedDB - Querying and Performance
IndexedDB - Querying and PerformanceIndexedDB - Querying and Performance
IndexedDB - Querying and Performance
Parashuram N
 

What's hot (19)

Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016
 
AngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.jsAngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.js
 
Single Page Web Apps with Backbone.js and Rails
Single Page Web Apps with Backbone.js and RailsSingle Page Web Apps with Backbone.js and Rails
Single Page Web Apps with Backbone.js and Rails
 
Node.js server-side rendering
Node.js server-side renderingNode.js server-side rendering
Node.js server-side rendering
 
How routing works in angular js
How routing works in angular jsHow routing works in angular js
How routing works in angular js
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorial
 
Resource and view
Resource and viewResource and view
Resource and view
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & REST
 
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
 
Ruby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 AjaxRuby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 Ajax
 
Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017
 
Upgrading from Angular 1.x to Angular 2.x
Upgrading from Angular 1.x to Angular 2.xUpgrading from Angular 1.x to Angular 2.x
Upgrading from Angular 1.x to Angular 2.x
 
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
 
Session 2
Session 2Session 2
Session 2
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using RubyTesting ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
 
19.imagini in laravel5
19.imagini in laravel519.imagini in laravel5
19.imagini in laravel5
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
 
IndexedDB - Querying and Performance
IndexedDB - Querying and PerformanceIndexedDB - Querying and Performance
IndexedDB - Querying and Performance
 

Viewers also liked

Tareas
TareasTareas
Tareas
Mi Clase Inf
 
Technologies
TechnologiesTechnologies
Technologies
kainegan
 
Attractign audiences
Attractign audiencesAttractign audiences
Attractign audiences
kainegan
 
Distribution
DistributionDistribution
Distribution
kainegan
 
Jak stworzyć prawidłowe cv.pptx
Jak stworzyć prawidłowe cv.pptxJak stworzyć prawidłowe cv.pptx
Jak stworzyć prawidłowe cv.pptxDagmara Szubert
 
Salam
SalamSalam
Salam
Aamir Ayaz
 
Presentation on istisna
Presentation on istisnaPresentation on istisna
Presentation on istisna
Aamir Ayaz
 
Islamic mode of finance istisna
Islamic mode of finance istisnaIslamic mode of finance istisna
Islamic mode of finance istisna
Aamir Ayaz
 
интерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
интерфейс оплаты счёта или пополнения баланса платёжной системы Smartyинтерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
интерфейс оплаты счёта или пополнения баланса платёжной системы SmartySmarty payment system
 
יד טבנקין מוזיאון למורשת החלוציות
יד טבנקין   מוזיאון למורשת החלוציותיד טבנקין   מוזיאון למורשת החלוציות
יד טבנקין מוזיאון למורשת החלוציותיד טבנקין
 

Viewers also liked (12)

Tareas
TareasTareas
Tareas
 
Technologies
TechnologiesTechnologies
Technologies
 
Attractign audiences
Attractign audiencesAttractign audiences
Attractign audiences
 
Distribution
DistributionDistribution
Distribution
 
Jak stworzyć prawidłowe cv.pptx
Jak stworzyć prawidłowe cv.pptxJak stworzyć prawidłowe cv.pptx
Jak stworzyć prawidłowe cv.pptx
 
Salam
SalamSalam
Salam
 
Presentation on istisna
Presentation on istisnaPresentation on istisna
Presentation on istisna
 
Islamic mode of finance istisna
Islamic mode of finance istisnaIslamic mode of finance istisna
Islamic mode of finance istisna
 
интерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
интерфейс оплаты счёта или пополнения баланса платёжной системы Smartyинтерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
интерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
 
1 правила пс смарти
1 правила пс смарти1 правила пс смарти
1 правила пс смарти
 
Szkolenie wolontariat
Szkolenie wolontariatSzkolenie wolontariat
Szkolenie wolontariat
 
יד טבנקין מוזיאון למורשת החלוציות
יד טבנקין   מוזיאון למורשת החלוציותיד טבנקין   מוזיאון למורשת החלוציות
יד טבנקין מוזיאון למורשת החלוציות
 

Similar to Applications: A Series of States

The Rails Way
The Rails WayThe Rails Way
The Rails Way
Michał Orman
 
Angular JS deep dive
Angular JS deep diveAngular JS deep dive
Angular JS deep dive
Axilis
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
StirTrek 2018 - Rapid API Development with Sails
StirTrek 2018 - Rapid API Development with SailsStirTrek 2018 - Rapid API Development with Sails
StirTrek 2018 - Rapid API Development with Sails
Justin James
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
Nir Kaufman
 
The Google App Engine Oil Framework
The Google App Engine Oil FrameworkThe Google App Engine Oil Framework
The Google App Engine Oil Framework
Eric ShangKuan
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
Eliran Eliassy
 
Migrating from Struts 1 to Struts 2
Migrating from Struts 1 to Struts 2Migrating from Struts 1 to Struts 2
Migrating from Struts 1 to Struts 2
Matt Raible
 
What You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSFWhat You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSF
Max Katz
 
Spring-training-in-bangalore
Spring-training-in-bangaloreSpring-training-in-bangalore
Spring-training-in-bangalore
TIB Academy
 
What's Coming in Spring 3.0
What's Coming in Spring 3.0What's Coming in Spring 3.0
What's Coming in Spring 3.0
Matt Raible
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful Rails
Viget Labs
 
Introduction to angular js
Introduction to angular jsIntroduction to angular js
Introduction to angular js
Marco Vito Moscaritolo
 
Jsf
JsfJsf
Jsf intro
Jsf introJsf intro
Jsf intro
vantinhkhuc
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
BOSC Tech Labs
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
Anthony Chen
 
Codeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate UriCodeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate Uri
Abdul Malik Ikhsan
 
App coordinators in iOS
App coordinators in iOSApp coordinators in iOS
App coordinators in iOS
Uptech
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 

Similar to Applications: A Series of States (20)

The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Angular JS deep dive
Angular JS deep diveAngular JS deep dive
Angular JS deep dive
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
 
StirTrek 2018 - Rapid API Development with Sails
StirTrek 2018 - Rapid API Development with SailsStirTrek 2018 - Rapid API Development with Sails
StirTrek 2018 - Rapid API Development with Sails
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
 
The Google App Engine Oil Framework
The Google App Engine Oil FrameworkThe Google App Engine Oil Framework
The Google App Engine Oil Framework
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
Migrating from Struts 1 to Struts 2
Migrating from Struts 1 to Struts 2Migrating from Struts 1 to Struts 2
Migrating from Struts 1 to Struts 2
 
What You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSFWhat You Need To Build Cool Enterprise Applications With JSF
What You Need To Build Cool Enterprise Applications With JSF
 
Spring-training-in-bangalore
Spring-training-in-bangaloreSpring-training-in-bangalore
Spring-training-in-bangalore
 
What's Coming in Spring 3.0
What's Coming in Spring 3.0What's Coming in Spring 3.0
What's Coming in Spring 3.0
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful Rails
 
Introduction to angular js
Introduction to angular jsIntroduction to angular js
Introduction to angular js
 
Jsf
JsfJsf
Jsf
 
Jsf intro
Jsf introJsf intro
Jsf intro
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
Codeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate UriCodeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate Uri
 
App coordinators in iOS
App coordinators in iOSApp coordinators in iOS
App coordinators in iOS
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 

Recently uploaded

Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
SOFTTECHHUB
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
Kumud Singh
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
KAMESHS29
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
Neo4j
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
TIPNGVN2
 
20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website
Pixlogix Infotech
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 

Recently uploaded (20)

Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
 
20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 

Applications: A Series of States