SlideShare ist ein Scribd-Unternehmen logo
1 von 12
L’architecture MVVM
KnockoutJS
Jean-Baptiste Vigneron
j.vigneron@epsi.fr
@jbvigneron
David Bottiau
david.bottiau@epsi.fr
@dbottiau
KnockoutJS
• Framework pour le web
• Adaptation du MVVM côté client
• Décharge en partie le serveur
• Gratuit et Open Source
• Utilisable avec n’importe quelle technologie
• ASP.NET MVC
• Ruby on Rails
• node.js
• Utilisation maximale de Binding et d’Observable
• JSON via AJAX plutôt que le rappel des pages
• Téléchargeable sur knockoutjs.com ou via NuGet
MVVM avec KnockoutJS
• Model
• Objets JavaScript ou JSON
• Utilisation de Webservices
• ViewModel
• Liaison avec le Model (CRUD, appels AJAX)
• Liaison avec la View (notifications, animations)
• View
• Langage HTML
• Styles et animations CSS
Model or ViewModel ?
// Prototype
function todo() {
this.task = ko.observable(‘task to do’);
this.priority = ko.observable(5);
this.business = ko.observable(300);
this.state = ko.observable(‘new’);
};
// Add ViewModel to bind with the view
ko.applyBindings(new todo());
Les Observables
this.task = ko.observable(‘task to do’);
• Un seul mode de notifications : two-way
• Notifications
• De la vue au ViewModel
• Du ViewModel à la vue
• Permet d’avoir une vue plus dynamique
• Différents types
• Nombre
• Chaîne de caractères
Computed Observables
this.cost = ko.computed(function() {
return this.priority() * this.business();
}, this);
• Propriétés utilisées quand elles dépendent d’autres
observables
• Création de « converters »
Observable arrays
var myArray = ko.observableArray(); // initialize
myArray.push(‘Some value’); // add an item
• Utilisés pour lier des listes à la vue
• Notifications lors d’un ajout ou d’une suppression
• Méthodes de tris
• Méthodes de sélection dans une liste
Le Binding
Utilisation du ViewModel dans la vue
// Bind every properties of ViewModel to show them
Current task: <span data-bind="text: task"></span>
Priority: <span data-bind="text: priority"></span>
Business: <span data-bind="text: business"></span>
State: <span data-bind="text: state"></span>
// Bind every properties of ViewModel to update them
Current task: <input type="text" data-bind="value: task" />
Priority: <input type="number" data-bind="value: priority" />
Business: <input type="number" data-bind="value: business" />
State: <input type="text" data-bind="value: state" />
Le Binding
Les propriétés
Propriété Utilisation
visible Afficher l’élément (du DOM) si la propriété est à « true »
text Afficher la valeur contenu dans la propriété
css Utiliser une classe CSS en fonction de la valeur d’une propriété
foreach Création de la partie du DOM sous-jacente pour tous les éléments
de la collection
if / ifnot Afficher l’élément du DOM. A la différence de « visible », le « if »
supprime physiquement de manière temporaire l’élément
click Exécute un événement dans le ViewModel lors du clic
enable Active/Désactive un élément en fonction de la propriété
value Modification de la propriété à partir de la vue
checked Modification d’une propriété booléenne à partir de la vue
Exemple – Liste de tâches
Mettez le KO dans vos apps !
var todoViewModel = function (todos) {
var self = this;
// map array of passed in todos to an observableArray of Todo objects
self.todos = ko.observableArray(ko.utils.arrayMap(todos, function (todo) {
return new Todo(todo.content, todo.done);
}));
// store the new todo value being entered
self.current = ko.observable();
// remove a single todo
self.remove = function (todo) {
self.todos.remove(todo);
};
// more methods
};
Les Templates
Un UserControl ?
<div data-bind="template: { name: 'person-template', foreach: people }"></div>
<script type="text/html" id="person-template">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
• Généralement utilisés avec une liste (foreach)
• Création du code HTML réutilisable dans la vue
• KnockoutJS – knockoutjs.com
• Understanding MVVM for JavaScript -
http://addyosmani.com/blog/understanding-mvvm-a-guide-
for-javascript-developers/

Weitere ähnliche Inhalte

Was ist angesagt?

Le Web comme plateforme applicative - comment programme-t-on le Web?
Le Web comme plateforme applicative - comment programme-t-on le Web?Le Web comme plateforme applicative - comment programme-t-on le Web?
Le Web comme plateforme applicative - comment programme-t-on le Web?Francois Daoust
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptKhalid Jebbari
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.jsBruno Bonnin
 
Débuter avec Rails::API & AngularJS
Débuter avec Rails::API & AngularJSDébuter avec Rails::API & AngularJS
Débuter avec Rails::API & AngularJSFrédéric DUPERIER
 
Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Clément Dubois
 
Node.js et MongoDB: Mongoose
Node.js et MongoDB: MongooseNode.js et MongoDB: Mongoose
Node.js et MongoDB: Mongoosejeromegn
 
Présentation de WCF
Présentation de WCFPrésentation de WCF
Présentation de WCFRomain Coste
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Bruno Bonnin
 
jQuery - GTI780 & MTI780 - ETS - A08
jQuery - GTI780 & MTI780 - ETS - A08jQuery - GTI780 & MTI780 - ETS - A08
jQuery - GTI780 & MTI780 - ETS - A08Claude Coulombe
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !Bruno Bonnin
 
Introduction à Rails - Paris on Rails 2006
Introduction à Rails - Paris on Rails 2006Introduction à Rails - Paris on Rails 2006
Introduction à Rails - Paris on Rails 2006Eric D.
 
Node.js dans Windows Azure mobile services et web sites
Node.js dans Windows Azure mobile services et web sitesNode.js dans Windows Azure mobile services et web sites
Node.js dans Windows Azure mobile services et web sitesMicrosoft
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Yves-Emmanuel Jutard
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.jsTelecomValley
 
Utiliser pleinement le navigateur et les nouveaux clients web - AFUP 2007
Utiliser pleinement le navigateur et les nouveaux clients web  - AFUP 2007Utiliser pleinement le navigateur et les nouveaux clients web  - AFUP 2007
Utiliser pleinement le navigateur et les nouveaux clients web - AFUP 2007Eric D.
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
Nouveautés html5 et css3 dans internet explorer 10
Nouveautés html5 et css3 dans internet explorer 10Nouveautés html5 et css3 dans internet explorer 10
Nouveautés html5 et css3 dans internet explorer 10davrous
 

Was ist angesagt? (20)

Le Web comme plateforme applicative - comment programme-t-on le Web?
Le Web comme plateforme applicative - comment programme-t-on le Web?Le Web comme plateforme applicative - comment programme-t-on le Web?
Le Web comme plateforme applicative - comment programme-t-on le Web?
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascript
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 
Débuter avec Rails::API & AngularJS
Débuter avec Rails::API & AngularJSDébuter avec Rails::API & AngularJS
Débuter avec Rails::API & AngularJS
 
Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Node.js et MongoDB: Mongoose
Node.js et MongoDB: MongooseNode.js et MongoDB: Mongoose
Node.js et MongoDB: Mongoose
 
Présentation de WCF
Présentation de WCFPrésentation de WCF
Présentation de WCF
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !
 
jQuery - GTI780 & MTI780 - ETS - A08
jQuery - GTI780 & MTI780 - ETS - A08jQuery - GTI780 & MTI780 - ETS - A08
jQuery - GTI780 & MTI780 - ETS - A08
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !
 
Introduction à Rails - Paris on Rails 2006
Introduction à Rails - Paris on Rails 2006Introduction à Rails - Paris on Rails 2006
Introduction à Rails - Paris on Rails 2006
 
Node.js dans Windows Azure mobile services et web sites
Node.js dans Windows Azure mobile services et web sitesNode.js dans Windows Azure mobile services et web sites
Node.js dans Windows Azure mobile services et web sites
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014
 
Intro à angular
Intro à angularIntro à angular
Intro à angular
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js
 
Utiliser pleinement le navigateur et les nouveaux clients web - AFUP 2007
Utiliser pleinement le navigateur et les nouveaux clients web  - AFUP 2007Utiliser pleinement le navigateur et les nouveaux clients web  - AFUP 2007
Utiliser pleinement le navigateur et les nouveaux clients web - AFUP 2007
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
jQuery mobile vs Twitter bootstrap
jQuery mobile vs Twitter bootstrapjQuery mobile vs Twitter bootstrap
jQuery mobile vs Twitter bootstrap
 
Nouveautés html5 et css3 dans internet explorer 10
Nouveautés html5 et css3 dans internet explorer 10Nouveautés html5 et css3 dans internet explorer 10
Nouveautés html5 et css3 dans internet explorer 10
 

Andere mochten auch

Andere mochten auch (20)

MVVM
MVVMMVVM
MVVM
 
MVVM de A à Z
MVVM de A à ZMVVM de A à Z
MVVM de A à Z
 
MVVM par Karim PIerre Maalej
MVVM par Karim PIerre MaalejMVVM par Karim PIerre Maalej
MVVM par Karim PIerre Maalej
 
Présentation WPF
Présentation  WPFPrésentation  WPF
Présentation WPF
 
MVVM - Model View ViewModel
MVVM - Model View ViewModelMVVM - Model View ViewModel
MVVM - Model View ViewModel
 
MVVM ( Model View ViewModel )
MVVM ( Model View ViewModel )MVVM ( Model View ViewModel )
MVVM ( Model View ViewModel )
 
WPF MVVM
WPF MVVMWPF MVVM
WPF MVVM
 
Presentación reforma fiscal 2014vf (3)
Presentación reforma fiscal 2014vf (3)Presentación reforma fiscal 2014vf (3)
Presentación reforma fiscal 2014vf (3)
 
Dossier de Presse iPeel - Octobre 2011
Dossier de Presse iPeel - Octobre 2011Dossier de Presse iPeel - Octobre 2011
Dossier de Presse iPeel - Octobre 2011
 
Declic digital-business-2803
Declic digital-business-2803Declic digital-business-2803
Declic digital-business-2803
 
Le diagnotic produit
Le diagnotic produit Le diagnotic produit
Le diagnotic produit
 
ACTIVIDAD 8 CM
ACTIVIDAD 8 CMACTIVIDAD 8 CM
ACTIVIDAD 8 CM
 
Manual de procedimientos
Manual de procedimientosManual de procedimientos
Manual de procedimientos
 
Les tribus de l'OMO
Les tribus de l'OMOLes tribus de l'OMO
Les tribus de l'OMO
 
2012 avances en las_reformas_de_la_educacion_basica
2012 avances en las_reformas_de_la_educacion_basica2012 avances en las_reformas_de_la_educacion_basica
2012 avances en las_reformas_de_la_educacion_basica
 
Présentation1
Présentation1Présentation1
Présentation1
 
Les pronoms complements d'objet direct
Les pronoms complements d'objet directLes pronoms complements d'objet direct
Les pronoms complements d'objet direct
 
Aplicaciones de internet
Aplicaciones de internetAplicaciones de internet
Aplicaciones de internet
 
02 conferencia dr_axel_didriksson
02 conferencia dr_axel_didriksson02 conferencia dr_axel_didriksson
02 conferencia dr_axel_didriksson
 
Activ 4 E-learning en asia
Activ 4 E-learning en asiaActiv 4 E-learning en asia
Activ 4 E-learning en asia
 

Ähnlich wie L'architecture MVVM avec KnockoutJS

La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursHoracio Gonzalez
 
vue j'avais pas vu !!
vue j'avais pas vu !!vue j'avais pas vu !!
vue j'avais pas vu !!Manuel Adele
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJSAbdoulaye Dieng
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascriptcodedarmor
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Frameworks JavaScript en environnement MS
Frameworks JavaScript en environnement MSFrameworks JavaScript en environnement MS
Frameworks JavaScript en environnement MSSébastien Ollivier
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)DNG Consulting
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Tarik Zakaria Benmerar
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Netvibes
 
2014.12.11 - TECH CONF #3 - Présentation Bootstrap
2014.12.11 - TECH CONF #3 - Présentation Bootstrap2014.12.11 - TECH CONF #3 - Présentation Bootstrap
2014.12.11 - TECH CONF #3 - Présentation BootstrapTelecomValley
 

Ähnlich wie L'architecture MVVM avec KnockoutJS (20)

Backbonejs presentation
Backbonejs presentationBackbonejs presentation
Backbonejs presentation
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
 
vue j'avais pas vu !!
vue j'avais pas vu !!vue j'avais pas vu !!
vue j'avais pas vu !!
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 
Workshop - Lightning Web Components
Workshop - Lightning Web ComponentsWorkshop - Lightning Web Components
Workshop - Lightning Web Components
 
Workshop Lightning Web Components
Workshop Lightning Web ComponentsWorkshop Lightning Web Components
Workshop Lightning Web Components
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Frameworks JavaScript en environnement MS
Frameworks JavaScript en environnement MSFrameworks JavaScript en environnement MS
Frameworks JavaScript en environnement MS
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007
 
2014.12.11 - TECH CONF #3 - Présentation Bootstrap
2014.12.11 - TECH CONF #3 - Présentation Bootstrap2014.12.11 - TECH CONF #3 - Présentation Bootstrap
2014.12.11 - TECH CONF #3 - Présentation Bootstrap
 

L'architecture MVVM avec KnockoutJS

  • 2. KnockoutJS • Framework pour le web • Adaptation du MVVM côté client • Décharge en partie le serveur • Gratuit et Open Source • Utilisable avec n’importe quelle technologie • ASP.NET MVC • Ruby on Rails • node.js • Utilisation maximale de Binding et d’Observable • JSON via AJAX plutôt que le rappel des pages • Téléchargeable sur knockoutjs.com ou via NuGet
  • 3. MVVM avec KnockoutJS • Model • Objets JavaScript ou JSON • Utilisation de Webservices • ViewModel • Liaison avec le Model (CRUD, appels AJAX) • Liaison avec la View (notifications, animations) • View • Langage HTML • Styles et animations CSS
  • 4. Model or ViewModel ? // Prototype function todo() { this.task = ko.observable(‘task to do’); this.priority = ko.observable(5); this.business = ko.observable(300); this.state = ko.observable(‘new’); }; // Add ViewModel to bind with the view ko.applyBindings(new todo());
  • 5. Les Observables this.task = ko.observable(‘task to do’); • Un seul mode de notifications : two-way • Notifications • De la vue au ViewModel • Du ViewModel à la vue • Permet d’avoir une vue plus dynamique • Différents types • Nombre • Chaîne de caractères
  • 6. Computed Observables this.cost = ko.computed(function() { return this.priority() * this.business(); }, this); • Propriétés utilisées quand elles dépendent d’autres observables • Création de « converters »
  • 7. Observable arrays var myArray = ko.observableArray(); // initialize myArray.push(‘Some value’); // add an item • Utilisés pour lier des listes à la vue • Notifications lors d’un ajout ou d’une suppression • Méthodes de tris • Méthodes de sélection dans une liste
  • 8. Le Binding Utilisation du ViewModel dans la vue // Bind every properties of ViewModel to show them Current task: <span data-bind="text: task"></span> Priority: <span data-bind="text: priority"></span> Business: <span data-bind="text: business"></span> State: <span data-bind="text: state"></span> // Bind every properties of ViewModel to update them Current task: <input type="text" data-bind="value: task" /> Priority: <input type="number" data-bind="value: priority" /> Business: <input type="number" data-bind="value: business" /> State: <input type="text" data-bind="value: state" />
  • 9. Le Binding Les propriétés Propriété Utilisation visible Afficher l’élément (du DOM) si la propriété est à « true » text Afficher la valeur contenu dans la propriété css Utiliser une classe CSS en fonction de la valeur d’une propriété foreach Création de la partie du DOM sous-jacente pour tous les éléments de la collection if / ifnot Afficher l’élément du DOM. A la différence de « visible », le « if » supprime physiquement de manière temporaire l’élément click Exécute un événement dans le ViewModel lors du clic enable Active/Désactive un élément en fonction de la propriété value Modification de la propriété à partir de la vue checked Modification d’une propriété booléenne à partir de la vue
  • 10. Exemple – Liste de tâches Mettez le KO dans vos apps ! var todoViewModel = function (todos) { var self = this; // map array of passed in todos to an observableArray of Todo objects self.todos = ko.observableArray(ko.utils.arrayMap(todos, function (todo) { return new Todo(todo.content, todo.done); })); // store the new todo value being entered self.current = ko.observable(); // remove a single todo self.remove = function (todo) { self.todos.remove(todo); }; // more methods };
  • 11. Les Templates Un UserControl ? <div data-bind="template: { name: 'person-template', foreach: people }"></div> <script type="text/html" id="person-template"> <h3 data-bind="text: name"></h3> <p>Credits: <span data-bind="text: credits"></span></p> </script> • Généralement utilisés avec une liste (foreach) • Création du code HTML réutilisable dans la vue
  • 12. • KnockoutJS – knockoutjs.com • Understanding MVVM for JavaScript - http://addyosmani.com/blog/understanding-mvvm-a-guide- for-javascript-developers/