SlideShare una empresa de Scribd logo
1 de 230
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

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 2016Codemotion
 
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.jsMark
 
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 RailsPrateek Dayal
 
How routing works in angular js
How routing works in angular jsHow routing works in angular js
How routing works in angular jscodeandyou forums
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorialClaude Tech
 
Resource and view
Resource and viewResource and view
Resource and viewPapp Laszlo
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & RESTRobbert
 
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 和 AjaxWen-Tien Chang
 
Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017Manipulating Magento - Meet Magento Belgium 2017
Manipulating Magento - Meet Magento Belgium 2017Joke 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.xEyal 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 2017Joke Puts
 
Session 2
Session 2Session 2
Session 2alfador
 
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 RubyBen Hall
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0Eyal 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 AngularJSmurtazahaveliwala
 
IndexedDB - Querying and Performance
IndexedDB - Querying and PerformanceIndexedDB - Querying and Performance
IndexedDB - Querying and PerformanceParashuram N
 

La actualidad más candente (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
 

Destacado

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

Destacado (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 a Applications: A Series of States

Angular JS deep dive
Angular JS deep diveAngular JS deep dive
Angular JS deep diveAxilis
 
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 serverSpike 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 SailsJustin James
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing optionsNir Kaufman
 
The Google App Engine Oil Framework
The Google App Engine Oil FrameworkThe Google App Engine Oil Framework
The Google App Engine Oil FrameworkEric 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 2Matt 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 JSFMax Katz
 
Spring-training-in-bangalore
Spring-training-in-bangaloreSpring-training-in-bangalore
Spring-training-in-bangaloreTIB 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.0Matt Raible
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful RailsViget Labs
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in reactBOSC Tech Labs
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard IntroductionAnthony Chen
 
Codeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate UriCodeigniter : Custom Routing - Manipulate Uri
Codeigniter : Custom Routing - Manipulate UriAbdul Malik Ikhsan
 
App coordinators in iOS
App coordinators in iOSApp coordinators in iOS
App coordinators in iOSUptech
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overviewYehuda Katz
 

Similar a 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
 

Último

Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
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
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 

Último (20)

Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
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
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 

Applications: A Series of States