SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Best of Brew City (BOB)
Mobile Web App - SPA, Backbone.js, Zepto.
js, HTML5, CSS3, JSON API
-Ezekiel Chentnik
What’s this guy gonna talk about?
●
●
●
●
●

what is BOB?
birds eye view of project
technical features
lessons learned
future of project

http://www.jsonline.com/brewcity/?mode=preview
What is BOB?
● A comprehensive & friendly mobile web app that allows
you to find things to do in Milwaukee
● Single page app that acts like a native app
● Built with:
○ HTML5, CSS3, JavaScript,
○ Underscore.js, Backbone.js, Zepto.js,
○ JSON API
○ appMobi
Bird’s Eye View of project
1.
2.
3.
4.

conception/discovery
time estimates, requirements, project approval
project: 2 week sprints, daily standups (soft launch, hard launch)
maintenance/v2

My role
●
●
●

Lead developer (full tech stack)
UI/UX guy
Manager, Teacher, Liaison
Performance
http://gtmetrix.com/reports/m.jsonline.com/xVWam8Sv
Performance
Goal: make as fast as possible
Accomplished: under 1 second home page load .36s
○ embedded image data uri's & sprites
○ compressed css, html & js
○ reduced http requests
○ google web font optimization using condensed font face calls and data
uri embedded fonts
○ server loaded google analytic assets
○ reduced html markup and nested HTML nodes
Improving: (testing: blocking scripts/js, asset caching/fragments, sprites/webfont icons)
Buttery Smooth UI
Goal: make super fast feeling, with native like UI
Features
● ios style page transitions
● pull to refresh
● momentum scrolling w/ios document jumping
bug fixed
Techniques:
● curbing user expectations
● hardware acceleration
● memory management - lightweight views
● panel rendering, active state
http://youtu.be/iPL5-9vWTLU

Demo - Pull to refresh, page transitions, momentum scrolling, overflow
rubber-band effect
Code snippet - Scrolling
.scrollenabled .scrollable{overflow:auto;-webkit-overflow-scrolling:touch;}
.no-scrollenabled .scrollable{/*defaults handle this case, modernizr*/}
.scrollenabled .scrollable .rubberband{margin:-1px 0 0 0;overflow:auto;height:100%;}
.scrollenabled .scrollable .inner-rubberband{margin:1px 0 10px 0;min-height:100%;}
.scrollenabled .scrollable .inner-rubberband:after {content: "";display: table;clear: both;}
<div id="panels" class="navigation-transition">
<section class="active panel promotions">
<article class="active view">
<header> [blue nav bar]
<div class="content scrollable">
<div class="rubberband">
<div class="inner-rubberband">
<div class="refresh">[pull to refresh goes here]
<div class="guts">
[page content goes here]
BOB’s Data
●
●
●
●
●

data caching - localStorage memcache style
geo located results lists - watchPosition, distance threshold
offline error handling
panel rendering/boot-straping panel data
JSON API
JSON/P API
JSON API, JSONP, or Data Bootstraping

JSON/P API
consumed by
BOB

wizardry &
magical
mashing

lucene .net
search service xml

zvents - event
search service xml

Clickability CMS
Data

http://m.jsonline.
com/api/v1/?
bust=y&custom=bl
_get_promotions&t
ype=JI.
BusinessListing&p
age_size=50&serv
icedebug=true&da
y=Wednesday&lati
tude=43.
042723795&longit
ude=-87.91450082
&sortByField=dista
nce&_=138557487
8454
http://youtu.be/Ov69uMrB20Q

Demo - Loading data, fading images, direct url entry points
Code snippet - Panel Rendering
listings:function(splat,queryString){//our route handler
var self = this;
var params = BOB.parseQueryString(queryString);
$.extend(params,BOB.currentPosition);
params.sortByField = "distance";
var collection = new BOB.ListingsCollection([],{params:params});
var view = new BOB.ListingsView({section:self.currentSection,collection:collection,state:self.currentState});
self.fetchCollectionAndRenderView(view,collection,params);
}
●
●
●
●

listen for route change
initialize route data - create view, collection, state
render panel shell
try cached data, render data OR try fetch data, render data on success
fetchCollectionAndRenderView:function(view,collection,params){//helper method
var self = this;
view.renderPanel();
var storeUrl = _.isFunction(collection.url) ? collection.url() : collection.url;
var resp = self.storageManager.get(storeUrl);
if(resp){
collection.reset(collection.parse(resp),{silent:true});
collection.updateDistances(params.latitude,params.longitude);
collection.sortByField(params.sortByField);
view.renderCollection();
self.transitionManager.show(view);
BOB.stash.add(collection.models,{silent:true});
}else{
self.transitionManager.show(view);
collection.fetch({cache:false,reset:false,silent:true,success:function(c,r,o){
if(c.length > 0){
c.updateDistances(params.latitude,params.longitude);
c.sortByField(params.sortByField);
self.storageManager.set(storeUrl,r);
c.trigger("reset");
}else{
c.trigger("collection:zeroresults");
}
BOB.stash.add(c.models,{silent:true});
},error:function(xhr, errorType, error){
collection.trigger("collection:error");
}});
More features...
●
●
●
●

code base refreshing & idle aware app
last page aware, persistent login, prepped for full offline abilities
debug tools
admin control panel for producers or customers
The Control Panel
Lessons learned...
● too much time spent on non
impactful features, not enough time
spent on important features
● API needs more data architecting
● feeling is important (design is more
than...)
● css bloats, deadlines & other
people
Looking forward - V2
Features:
●
●
●
●
●

re-skin - IOS7 style, flat theme, icon updates
update homepage layout
advanced map controls, search, personality through content
cms interface for updating/adding sections
facebook integration

Code:
●
●
●
●

UI performance improvements (make it even faster) - faster views, smoother transitions
build out debug tools
refactor & modularize codebase - reusable library for other markets
restructure router/controller/pub-sub [explain on whiteboard]

Contenu connexe

Similaire à Best of brew city presentation final

I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayAll Things Open
 
Now you see me... Adaptive Web Design and Development
Now you see me... Adaptive Web Design and DevelopmentNow you see me... Adaptive Web Design and Development
Now you see me... Adaptive Web Design and DevelopmentJonas Päckos
 
Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...IT Event
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayPOSSCON
 
Fake it 'til you make it
Fake it 'til you make itFake it 'til you make it
Fake it 'til you make itJonathan Snook
 
gDayX - Advanced angularjs
gDayX - Advanced angularjsgDayX - Advanced angularjs
gDayX - Advanced angularjsgdgvietnam
 
Web Apps and more
Web Apps and moreWeb Apps and more
Web Apps and moreYan Shi
 
Web app and more
Web app and moreWeb app and more
Web app and morefaming su
 
ServiceWorker: New game changer is coming!
ServiceWorker: New game changer is coming!ServiceWorker: New game changer is coming!
ServiceWorker: New game changer is coming!Chang W. Doh
 
Deep crawl the chaotic landscape of JavaScript
Deep crawl the chaotic landscape of JavaScript Deep crawl the chaotic landscape of JavaScript
Deep crawl the chaotic landscape of JavaScript Onely
 
Intro To Django
Intro To DjangoIntro To Django
Intro To DjangoUdi Bauman
 
There Are No “Buts” in Progressive Enhancement [Øredev 2015]
There Are No “Buts” in Progressive Enhancement [Øredev 2015]There Are No “Buts” in Progressive Enhancement [Øredev 2015]
There Are No “Buts” in Progressive Enhancement [Øredev 2015]Aaron Gustafson
 
Progressive Web App Challenges
Progressive Web App ChallengesProgressive Web App Challenges
Progressive Web App ChallengesJason Grigsby
 
From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)Bramus Van Damme
 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletonGeorge Nguyen
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Jamie Matthews
 

Similaire à Best of brew city presentation final (20)

I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
Now you see me... Adaptive Web Design and Development
Now you see me... Adaptive Web Design and DevelopmentNow you see me... Adaptive Web Design and Development
Now you see me... Adaptive Web Design and Development
 
Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
Fake it 'til you make it
Fake it 'til you make itFake it 'til you make it
Fake it 'til you make it
 
gDayX - Advanced angularjs
gDayX - Advanced angularjsgDayX - Advanced angularjs
gDayX - Advanced angularjs
 
Web Apps and more
Web Apps and moreWeb Apps and more
Web Apps and more
 
Web app and more
Web app and moreWeb app and more
Web app and more
 
ServiceWorker: New game changer is coming!
ServiceWorker: New game changer is coming!ServiceWorker: New game changer is coming!
ServiceWorker: New game changer is coming!
 
Deep crawl the chaotic landscape of JavaScript
Deep crawl the chaotic landscape of JavaScript Deep crawl the chaotic landscape of JavaScript
Deep crawl the chaotic landscape of JavaScript
 
Intro To Django
Intro To DjangoIntro To Django
Intro To Django
 
Taking your Web App for a walk
Taking your Web App for a walkTaking your Web App for a walk
Taking your Web App for a walk
 
There Are No “Buts” in Progressive Enhancement [Øredev 2015]
There Are No “Buts” in Progressive Enhancement [Øredev 2015]There Are No “Buts” in Progressive Enhancement [Øredev 2015]
There Are No “Buts” in Progressive Enhancement [Øredev 2015]
 
Progressive Web App Challenges
Progressive Web App ChallengesProgressive Web App Challenges
Progressive Web App Challenges
 
4-identifying-problems.pdf
4-identifying-problems.pdf4-identifying-problems.pdf
4-identifying-problems.pdf
 
From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)
 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
 
Nicolas Embleton, Advanced Angular JS
Nicolas Embleton, Advanced Angular JSNicolas Embleton, Advanced Angular JS
Nicolas Embleton, Advanced Angular JS
 
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
Five Pound App talk: hereit.is, Web app architecture, REST, CSS3
 
GWT Architectures and Lessons Learned (WJAX 2013)
GWT Architectures and Lessons Learned (WJAX 2013)GWT Architectures and Lessons Learned (WJAX 2013)
GWT Architectures and Lessons Learned (WJAX 2013)
 

Dernier

[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
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
 
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
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
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 FresherRemote DBA Services
 
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
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
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
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
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
 
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
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
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
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
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.pdfsudhanshuwaghmare1
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 

Dernier (20)

[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
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...
 
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
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
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
 
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 ...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
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 the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
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
 
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
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
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, ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
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
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

Best of brew city presentation final

  • 1. Best of Brew City (BOB) Mobile Web App - SPA, Backbone.js, Zepto. js, HTML5, CSS3, JSON API -Ezekiel Chentnik
  • 2. What’s this guy gonna talk about? ● ● ● ● ● what is BOB? birds eye view of project technical features lessons learned future of project http://www.jsonline.com/brewcity/?mode=preview
  • 3. What is BOB? ● A comprehensive & friendly mobile web app that allows you to find things to do in Milwaukee ● Single page app that acts like a native app ● Built with: ○ HTML5, CSS3, JavaScript, ○ Underscore.js, Backbone.js, Zepto.js, ○ JSON API ○ appMobi
  • 4. Bird’s Eye View of project 1. 2. 3. 4. conception/discovery time estimates, requirements, project approval project: 2 week sprints, daily standups (soft launch, hard launch) maintenance/v2 My role ● ● ● Lead developer (full tech stack) UI/UX guy Manager, Teacher, Liaison
  • 7. Performance Goal: make as fast as possible Accomplished: under 1 second home page load .36s ○ embedded image data uri's & sprites ○ compressed css, html & js ○ reduced http requests ○ google web font optimization using condensed font face calls and data uri embedded fonts ○ server loaded google analytic assets ○ reduced html markup and nested HTML nodes Improving: (testing: blocking scripts/js, asset caching/fragments, sprites/webfont icons)
  • 8. Buttery Smooth UI Goal: make super fast feeling, with native like UI Features ● ios style page transitions ● pull to refresh ● momentum scrolling w/ios document jumping bug fixed Techniques: ● curbing user expectations ● hardware acceleration ● memory management - lightweight views ● panel rendering, active state
  • 9. http://youtu.be/iPL5-9vWTLU Demo - Pull to refresh, page transitions, momentum scrolling, overflow rubber-band effect
  • 10. Code snippet - Scrolling .scrollenabled .scrollable{overflow:auto;-webkit-overflow-scrolling:touch;} .no-scrollenabled .scrollable{/*defaults handle this case, modernizr*/} .scrollenabled .scrollable .rubberband{margin:-1px 0 0 0;overflow:auto;height:100%;} .scrollenabled .scrollable .inner-rubberband{margin:1px 0 10px 0;min-height:100%;} .scrollenabled .scrollable .inner-rubberband:after {content: "";display: table;clear: both;} <div id="panels" class="navigation-transition"> <section class="active panel promotions"> <article class="active view"> <header> [blue nav bar] <div class="content scrollable"> <div class="rubberband"> <div class="inner-rubberband"> <div class="refresh">[pull to refresh goes here] <div class="guts"> [page content goes here]
  • 11. BOB’s Data ● ● ● ● ● data caching - localStorage memcache style geo located results lists - watchPosition, distance threshold offline error handling panel rendering/boot-straping panel data JSON API
  • 12. JSON/P API JSON API, JSONP, or Data Bootstraping JSON/P API consumed by BOB wizardry & magical mashing lucene .net search service xml zvents - event search service xml Clickability CMS Data http://m.jsonline. com/api/v1/? bust=y&custom=bl _get_promotions&t ype=JI. BusinessListing&p age_size=50&serv icedebug=true&da y=Wednesday&lati tude=43. 042723795&longit ude=-87.91450082 &sortByField=dista nce&_=138557487 8454
  • 13. http://youtu.be/Ov69uMrB20Q Demo - Loading data, fading images, direct url entry points
  • 14. Code snippet - Panel Rendering listings:function(splat,queryString){//our route handler var self = this; var params = BOB.parseQueryString(queryString); $.extend(params,BOB.currentPosition); params.sortByField = "distance"; var collection = new BOB.ListingsCollection([],{params:params}); var view = new BOB.ListingsView({section:self.currentSection,collection:collection,state:self.currentState}); self.fetchCollectionAndRenderView(view,collection,params); } ● ● ● ● listen for route change initialize route data - create view, collection, state render panel shell try cached data, render data OR try fetch data, render data on success
  • 15. fetchCollectionAndRenderView:function(view,collection,params){//helper method var self = this; view.renderPanel(); var storeUrl = _.isFunction(collection.url) ? collection.url() : collection.url; var resp = self.storageManager.get(storeUrl); if(resp){ collection.reset(collection.parse(resp),{silent:true}); collection.updateDistances(params.latitude,params.longitude); collection.sortByField(params.sortByField); view.renderCollection(); self.transitionManager.show(view); BOB.stash.add(collection.models,{silent:true}); }else{ self.transitionManager.show(view); collection.fetch({cache:false,reset:false,silent:true,success:function(c,r,o){ if(c.length > 0){ c.updateDistances(params.latitude,params.longitude); c.sortByField(params.sortByField); self.storageManager.set(storeUrl,r); c.trigger("reset"); }else{ c.trigger("collection:zeroresults"); } BOB.stash.add(c.models,{silent:true}); },error:function(xhr, errorType, error){ collection.trigger("collection:error"); }});
  • 16. More features... ● ● ● ● code base refreshing & idle aware app last page aware, persistent login, prepped for full offline abilities debug tools admin control panel for producers or customers
  • 17.
  • 19.
  • 20.
  • 21. Lessons learned... ● too much time spent on non impactful features, not enough time spent on important features ● API needs more data architecting ● feeling is important (design is more than...) ● css bloats, deadlines & other people
  • 22. Looking forward - V2 Features: ● ● ● ● ● re-skin - IOS7 style, flat theme, icon updates update homepage layout advanced map controls, search, personality through content cms interface for updating/adding sections facebook integration Code: ● ● ● ● UI performance improvements (make it even faster) - faster views, smoother transitions build out debug tools refactor & modularize codebase - reusable library for other markets restructure router/controller/pub-sub [explain on whiteboard]