SlideShare a Scribd company logo
applications: a series of states
a talk by @trek
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
<a href=”serialize/user/intent.fmt”>
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
GET https://simple.com/activity
Applications: A Series of States
Applications: A Series of States
GET https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
GET https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba/edit
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
PUT https://simple.com/activity/transactions/3a709ef6-
c300-43b4-bca0-af72d1ecd4ba
HTTP 302 Found
GET https://simple.com/activity
Applications: A Series of States
Applications: A Series of States
!
Applications: A Series of States
Applications: A Series of States
http://imgs.xkcd.com/comics/regular_expressions.png
Applications: A Series of States
Applications: A Series of States
GET https://simple.com/activity
Applications: A Series of States
Applications: A Series of States
$('.some-selector').click(function(){
$.ajax({
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
$('.some-selector').click(function(){
$.ajax({
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
$('.some-button').click(function(){
$.ajax({
type: ‘post’,
success: function(response){
var html = $templates.transactionDetails(response);
$('#some-section-of-my-page).html(html);
}
})
})
Applications: A Series of States
Applications: A Series of States
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
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
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);
}
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
<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
Applications: A Series of States
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);
}
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
app.PurchaseRowView = Backbone.View.extend({
...
events: { 'click': 'toggleMoreDetails' },
toggleMoreDetails: function(){
this.model.toggleMoreDetails();
this.$el.toggleClass( 'selected', this.moreDetailsShowing);
}
});
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
truth-in-data
truth-in-datatruth-in-data
model.on(‘change’)/
collection.on(‘change’)
-> render
model.on(‘change’)
-> render
model.on(‘change’)
-> render
{}
Applications: A Series of States
Applications: A Series of States
<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>
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
possible, but you must be cautious
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
{{view App.NavigationView}}
{{view App.SummaryView}}
{{ outlet }}
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
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}}
Applications: A Series of States
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?
Applications: A Series of States
Applications: A Series of States
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
Applications: A Series of States
> 7 views
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
Applications: A Series of States
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

PDF
PrimeTime JSF with PrimeFaces - Dec 2014
PPTX
Angular 2.0 Routing and Navigation
PDF
Primefaces Confess 2012
PDF
Empowering users: modifying the admin experience
PDF
Primefaces Nextgen Lju
PDF
AnkaraJUG Kasım 2012 - PrimeFaces
PDF
Advanced RESTful Rails
PDF
Ajax Rails
 
PrimeTime JSF with PrimeFaces - Dec 2014
Angular 2.0 Routing and Navigation
Primefaces Confess 2012
Empowering users: modifying the admin experience
Primefaces Nextgen Lju
AnkaraJUG Kasım 2012 - PrimeFaces
Advanced RESTful Rails
Ajax Rails
 

What's hot (19)

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

Viewers also liked (12)

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

Similar to Applications: A Series of States (20)

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

Recently uploaded (20)

PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Machine learning based COVID-19 study performance prediction
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Big Data Technologies - Introduction.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
KodekX | Application Modernization Development
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PDF
Empathic Computing: Creating Shared Understanding
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Network Security Unit 5.pdf for BCA BBA.
Chapter 3 Spatial Domain Image Processing.pdf
Unlocking AI with Model Context Protocol (MCP)
MYSQL Presentation for SQL database connectivity
Machine learning based COVID-19 study performance prediction
“AI and Expert System Decision Support & Business Intelligence Systems”
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced Soft Computing BINUS July 2025.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Big Data Technologies - Introduction.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
KodekX | Application Modernization Development
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Empathic Computing: Creating Shared Understanding
The Rise and Fall of 3GPP – Time for a Sabbatical?
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Network Security Unit 5.pdf for BCA BBA.

Applications: A Series of States