SlideShare ist ein Scribd-Unternehmen logo
1 von 230
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Resource and view
Resource and viewResource and view
Resource and view
Papp Laszlo
 
Ruby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 AjaxRuby on Rails : RESTful 和 Ajax
Ruby on Rails : RESTful 和 Ajax
Wen-Tien Chang
 

Was ist angesagt? (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
 

Andere mochten auch

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.pptx
Dagmara Szubert
 
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
интерфейс оплаты счёта или пополнения баланса платёжной системы Smarty
Smarty payment system
 
יד טבנקין מוזיאון למורשת החלוציות
יד טבנקין   מוזיאון למורשת החלוציותיד טבנקין   מוזיאון למורשת החלוציות
יד טבנקין מוזיאון למורשת החלוציות
יד טבנקין
 

Andere mochten auch (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
 
יד טבנקין מוזיאון למורשת החלוציות
יד טבנקין   מוזיאון למורשת החלוציותיד טבנקין   מוזיאון למורשת החלוציות
יד טבנקין מוזיאון למורשת החלוציות
 

Ähnlich wie Applications: A Series of States

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
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 

Ähnlich wie 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
 

Kürzlich hochgeladen

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
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.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​
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
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 ...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
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
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
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
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

Applications: A Series of States