Building Rich User Experiences Without JavaScript Spaghetti
-
Upload
jared-faris -
Category
Technology
-
view
2.190 -
download
0
description
Transcript of Building Rich User Experiences Without JavaScript Spaghetti
![Page 1: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/1.jpg)
Building Rich User Experienceswithout
JavaScript Spaghetti
by Jared Faris@jaredthenerd
jaredthenerd.com
Friday, June 29, 12
![Page 2: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/2.jpg)
About me
Friday, June 29, 12
![Page 3: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/3.jpg)
Designers
Friday, June 29, 12
![Page 4: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/4.jpg)
Developers
Friday, June 29, 12
![Page 5: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/5.jpg)
JavaScript
Friday, June 29, 12
![Page 6: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/6.jpg)
A Developer’s Problem
Developers are the only people in the organization that wear every single hat.
Building a great user experience is hard.
It’s even harder to build them so that they cangrow painlessly.
Friday, June 29, 12
![Page 7: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/7.jpg)
Problem (part 2)
JavaScript lends itself very well to building really horrible code that doesn’t scale. At all. Ever.
Friday, June 29, 12
![Page 8: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/8.jpg)
A Typical Product LifecycleSomewhat dramatized...
Friday, June 29, 12
![Page 9: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/9.jpg)
Designer Developer
Friday, June 29, 12
![Page 10: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/10.jpg)
We need this feature
Friday, June 29, 12
![Page 11: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/11.jpg)
I got this
Friday, June 29, 12
![Page 12: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/12.jpg)
?
Friday, June 29, 12
![Page 13: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/13.jpg)
Tweaking time...
Friday, June 29, 12
![Page 14: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/14.jpg)
I got anothergreat idea
Friday, June 29, 12
![Page 15: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/15.jpg)
Now you tellme
Friday, June 29, 12
![Page 16: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/16.jpg)
The developer bolts on some more code
Friday, June 29, 12
![Page 17: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/17.jpg)
And anotherthing...
Friday, June 29, 12
![Page 18: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/18.jpg)
grrr
Friday, June 29, 12
![Page 19: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/19.jpg)
We don’t ‘really’
need this
Friday, June 29, 12
![Page 20: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/20.jpg)
Uh, yeah wedo
Friday, June 29, 12
![Page 21: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/21.jpg)
Friday, June 29, 12
![Page 22: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/22.jpg)
The developer bolts on some more code
Friday, June 29, 12
![Page 23: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/23.jpg)
Some time passes
‘Some time’ is defined as: Just long enough that the developer doesn’t remember
exactly how his original code works.
Friday, June 29, 12
![Page 24: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/24.jpg)
I’ve got a new feature
Friday, June 29, 12
![Page 25: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/25.jpg)
Angry developerscan really do this.IT managers be
warned.
Friday, June 29, 12
![Page 26: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/26.jpg)
Protective Beret
Friday, June 29, 12
![Page 27: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/27.jpg)
More messy code
Friday, June 29, 12
![Page 28: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/28.jpg)
The last bug
Oh wait, one more
Friday, June 29, 12
![Page 29: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/29.jpg)
Finally
Friday, June 29, 12
![Page 30: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/30.jpg)
The next day...
Friday, June 29, 12
![Page 31: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/31.jpg)
Friday, June 29, 12
![Page 32: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/32.jpg)
Two weeks pass.
Friday, June 29, 12
![Page 33: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/33.jpg)
I’ve got a new feature Gahh!
Friday, June 29, 12
![Page 34: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/34.jpg)
Friday, June 29, 12
![Page 35: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/35.jpg)
No developers were harmed in the makingof this dramatic reenactment.
Friday, June 29, 12
![Page 36: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/36.jpg)
Additional Features + Short Sighted Architecting= Horrible JavaScript Spaghetti
Friday, June 29, 12
![Page 37: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/37.jpg)
Why does this happen?
This is where you earn audience participation points.
Friday, June 29, 12
![Page 38: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/38.jpg)
Some Reasons
• JavaScript isn’t real code• We don’t treat client side things as real features• We can’t easily test it• We don’t like writing it• It behaves differently in different browsers
Friday, June 29, 12
![Page 39: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/39.jpg)
This really all boils down to one thing.
We developers suck at JavaScript.
Friday, June 29, 12
![Page 40: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/40.jpg)
Three JavaScript Principles
• Decouple everything• Make it testable• Push events, not state
Friday, June 29, 12
![Page 41: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/41.jpg)
Decouple Everything
Start thinking about UI pieces as individual JS objects.Remove dependencies between objects.Apply your OO best practices here too.
Friday, June 29, 12
![Page 42: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/42.jpg)
Make It Testable
Separate DOM dependent stuff into a single layer.Put the rest of the stuff in classes that you can test.
Friday, June 29, 12
![Page 43: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/43.jpg)
Push Events, Not State
Know about the Law of Demeter.Let controls worry about their own state.
Inform other controls that “X happened to Y”, not “Y is in X state”
Friday, June 29, 12
![Page 44: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/44.jpg)
Some Patterns
Friday, June 29, 12
![Page 45: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/45.jpg)
OO
• Think in terms of classes• Give behaviors to objects• Keep state inside of objects
Friday, June 29, 12
![Page 46: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/46.jpg)
Mediator Pattern
"The essence of the Mediator Pattern is to "Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you
vary their interaction independently."
-Design Patterns: Elements of Reusable Object-Oriented Software
Friday, June 29, 12
![Page 47: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/47.jpg)
NavControlMediator
itemSelected()
Events from some other object
unselectAll()
Friday, June 29, 12
![Page 48: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/48.jpg)
Observer Pattern
"Define a one-to-many dependency between objects so that when one object changes state, all its dependents
are notified and updated automatically."
-Design Patterns: Elements of Reusable Object-Oriented Software
Think jQuery $(‘.something’).click()
Friday, June 29, 12
![Page 49: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/49.jpg)
NavControlMediator
itemSelected()
Events from some other object
unselectAll()
viewModel
Friday, June 29, 12
![Page 50: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/50.jpg)
Knockout.js Template Example
Friday, June 29, 12
![Page 51: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/51.jpg)
Pub/Sub + Fairy Dust = Service Bus
Pub/Sub is great to make sure events propagate.It starts to get brittle with lots of different controls.
Friday, June 29, 12
![Page 52: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/52.jpg)
Way Too Much Pubbing and Subbing
Friday, June 29, 12
![Page 53: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/53.jpg)
Service Bus
A service bus is another layer that sits outside controls.Controls that want to communicate speak through it.Your controls are then only coupled to a single thing.
Friday, June 29, 12
![Page 54: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/54.jpg)
Postal.js
Friday, June 29, 12
![Page 55: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/55.jpg)
Service Bus + Mediator
• Controls no longer need to know about others.• We can remove/replace controls individually.• We can add controls that listen to the same events without modifying the publisher.• We can re-use pieces more easily because they work in a standard way.
Friday, June 29, 12
![Page 56: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/56.jpg)
NavControlMediator
itemSelected()
Events from some other object
unselectAll()
viewModel
ReportMediator
itemChanged()
unselectAll()
viewModel
Service Bus
Friday, June 29, 12
![Page 57: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/57.jpg)
NavControlMediator
itemSelected()
Events from some other object
unselectAll()
viewModel
ReportMediator
itemChanged()
unselectAll()
viewModel
Service Bus
HistoryControl
Friday, June 29, 12
![Page 58: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/58.jpg)
Service Bus
TeamControl
Gets team changed message, makes AJAX
call for this team’s data, rewrites team with template
No view model
Friday, June 29, 12
![Page 59: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/59.jpg)
Service Bus
Friday, June 29, 12
![Page 60: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/60.jpg)
Questions About Patterns?
Friday, June 29, 12
![Page 61: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/61.jpg)
A Typical Product LifecycleRound Two
Friday, June 29, 12
![Page 62: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/62.jpg)
We need this feature
Friday, June 29, 12
![Page 63: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/63.jpg)
I got a fewquestions
Friday, June 29, 12
![Page 64: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/64.jpg)
?
Friday, June 29, 12
![Page 65: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/65.jpg)
Tweaking time...
Friday, June 29, 12
![Page 66: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/66.jpg)
I got anothergreat idea
Friday, June 29, 12
![Page 67: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/67.jpg)
Ok, Cool
Friday, June 29, 12
![Page 68: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/68.jpg)
And anotherthing...
Friday, June 29, 12
![Page 69: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/69.jpg)
Done.
Friday, June 29, 12
![Page 70: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/70.jpg)
Two weeks pass...
Friday, June 29, 12
![Page 71: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/71.jpg)
I’ve got a new feature
Friday, June 29, 12
![Page 72: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/72.jpg)
No worries.
Friday, June 29, 12
![Page 73: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/73.jpg)
Wha? Ohhhk.
Friday, June 29, 12
![Page 74: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/74.jpg)
A short time later...
Friday, June 29, 12
![Page 75: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/75.jpg)
Friday, June 29, 12
![Page 76: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/76.jpg)
Special thanks to
He did the frame artBlame me for
everything else
Friday, June 29, 12
![Page 77: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/77.jpg)
Examples
Friday, June 29, 12
![Page 78: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/78.jpg)
A KO Warning
It’s really easy to go overboard with KO events.
I prefer to use KO for the VM binding (observables and computeds) but rely on jQuery for events.
jQuery’s .on() binding and a good understanding of ‘this’ makes for much cleaner events.
Friday, June 29, 12
![Page 79: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/79.jpg)
Easy Testing
Try to have layers of your application’s JS that don’t touch any HTML elements.
Store data in models inside individual controls and test that published messages change the state of those
models correctly.
Friday, June 29, 12
![Page 80: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/80.jpg)
Why Not Backbone.js?
Friday, June 29, 12
![Page 81: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/81.jpg)
Shared Model
Friday, June 29, 12
![Page 82: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/82.jpg)
NavControlMediator
itemSelected()
Events from some other object
unselectAll()
viewModel
ReportMediator
itemChanged()
unselectAll()
viewModel
Service Bus
Friday, June 29, 12
![Page 83: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/83.jpg)
Tools Make This Easier
Underscore.jsCoffeescriptTemplates
Friday, June 29, 12
![Page 84: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/84.jpg)
Knockout.js - Observer pattern (pub/sub)http://knockoutjs.com/
http://learn.knockoutjs.com/
Postal.js - Service bushttps://github.com/ifandelse/postal.js
http://freshbrewedcode.com/jimcowart/2011/12/05/client-side-messaging-with-postal-js-part-1/http://www.jaredthenerd.com/2012/01/using-postaljs-for-client-side.html
Patternshttp://arguments.callee.info/2009/05/18/javascript-design-patterns--mediator/
http://msdn.microsoft.com/en-us/magazine/hh201955.aspx (Pub/Sub)
Friday, June 29, 12
![Page 85: Building Rich User Experiences Without JavaScript Spaghetti](https://reader033.fdocuments.us/reader033/viewer/2022052823/5552bfb3b4c90581158b469c/html5/thumbnails/85.jpg)
My Stuff@jaredthenerd
[email protected]://github.com/jaredfaris
http://jaredthenerd.com
Rate Mehttp://spkr8.com/t/12731
Friday, June 29, 12