SlideShare uma empresa Scribd logo
1 de 29
Grazie a
           Sponsor
Agenda
• Knockout JS
  – Cosa, Quando, Perché
  – Alternative
• Knockout JS: Come
  – Oggetti observable
  – Attributi data-bind
Che cos’è Knockout JS
• Presentation Framework Javascript
  – Implementazione di un particolare Design Pattern
    di Presentation (UI): il Model-View-ViewModel
    (MVVM)
  – Implementato completamente in Javascript
  – Multi-Browser (che supporti HTML5)
  – Convive senza problemi con i maggiori
    Framework Javascript (jQuery, jQuery Mobile, …)
  – Portale del progetto http://knockoutjs.com
Model-View-ViewModel
• Il MVVM fa parte della cosiddetta famiglia
  dei presentation pattern MV*
  – disaccoppiare i dati rappresentati nella UI
    (Model) dalla UI stessa (View) promuovendo
    una netta separazione fra questi mediante
    l’uso di un oggetto terzo: il ViewModel
Model-View-ViewModel
• Si definiscono e si idratano i dati (Model) da
  visualizzare
• Si veicolano i dati attraverso il ViewModel verso la
  View utilizzando un meccanismo di data-bind
  che permetta la gestione bidirezionele degli
  aggiornamenti dei dati stessi
• Si definiscono delle operazioni nel ViewModel
  per gestire gli eventi provenienti dalla View
MVVM e HTML5
• View: il markup HTML
• Model: uno o più oggetti e array Javascript
  che contengono solo dati puri e che devono
  essere rappresentati nella View
• ViewModel: un oggetto Javascript che
  identifica una rappresentazione sotto forma
  di codice dei dati (Model) e delle operazioni
  della View
Knockout JS e MVVM
• Knockout JS si caratterizza principalmente per tre
  aspetti:
   – Sintassi specifica per la definizione di un binding
     dichiarativo dei dati nel markup HTML5
   – API Javascript per la definizione delle proprietà
     dell’oggetto ViewModel che fornisce un meccanismo
     automatico di notifica del loro aggiornamento
   – Sintassi di templating di frammenti di markup HTML
     per il rendering di liste/array
Quando usare Knockout JS
• Knockout JS offre una API in grado di
  semplificare e strutturare lo sviluppo di
  una logica di UI mediamente complessa
• L’uso di Knockout JS è indicato quando si
  affronta lo sviluppo di una Rich Internet
  Application (RIA) lato client
Perché usare Knockout JS
• Organizzazione della codebase in termini di
  responsabilità degli oggetti coinvolti e delle loro
  interazioni in modo da evitare il più possibile la
  produzione del cosiddetto codice spaghetti
• Gestione strutturata degli elementi e degli
  eventi del DOM
• Possibilità di sviluppare il codice utilizzando
  facilmente tecniche di Unit Testing
Alternative a Knockout JS
• Esistono altri Presentation Framework
  Javascript che:
  – Si prefiggono gli stessi obiettivi
  – Fanno parte della famiglia MV*
• Per citare i più conosciuti:
  – BackBone JS
  – Ember JS
  – Angular JS
Knockout JS in 2 minuti
• Definizione di un oggetto ViewModel
  Javascript con proprietà observable e
  metodi (command)
• Definizione del markup HTML5 con
  attributi data-bind
• Applicazione del ViewModel alla View
  mediante il metodo ko.applyBindings
Demo 01

DEMO
ViewModel: proprietà osservabili
• Knockout JS offre la possibilità di definire le
  proprietà del ViewModel come oggetti osservabili
  di tre tipi:
  – Observable
  – Computed Observable
  – Observable Array
• Hanno la capacità di notificare automaticamente
  l’aggiornamento del proprio valore alla View e
  viceversa
Oggetti Observable
• Leggerne il valore:
   var fn = self.firstName( );
• Scriverne il valore:
   self.firstName("Roberto");
• Chain syntax:
   self.firstName("Roberto").lastName("Messora");
• Sottoscrizione esplicita:
   self.firstName.subscribe(function(newValue) {
       …
   });
Oggetti Computed Observable
•   Definirne la composizione:
     self.isMinor = ko.computed(function() {
         return self.age() < 18;
     });
•   Possono essere concatenati:
     self.canDrive = ko.computed(function() {
         return self.isMinor() == false;
     });
•   Possono essere anche in scrittura per scenari come:
     – Decomposizione dell’input utente
     – Convertitore di valore/formato
     – Validatore di input utente
•   Offrono tutta una serie di metodi e opzioni per un uso avanzato
Oggetti Observable Array
• Definirne la composizione:
  self.myArray =
  ko.observableArray(["a", "b", "c"]);
• Ridefiniscono tutti i classici metodi di un
  normale array:
  – indexOf, slice
  – pop, push, shift, unshift, reverse, sort, splice
  – remove, removeAll, destroy, destroyAll
Demo 02

DEMO
Estendere un Observable
• Un oggetto Observable può essere esteso per
  fornirne ulteriori funzionalità custom
• Uno degli utilizzi più utili è quello della
  validazione delle proprietà del ViewModel
   ko.extenders.positiveNumberValidation =
      function(target, option) { … };
   …
   self.age = ko.observable(0).extend({
      positiveNumberValidation: "" });
Demo 03

DEMO
View: attributi di data-bind
• Knockout JS offre la possibilità di definire un attributo
  di data-bind nei tag del markup HTML5
• Sono disponibili 4 tipi di famiglie di binding:
   – Controllo del testo e del rendering:
     visible, text, html, css, style, attr
   – Controllo del flusso: foreach, if, ifnot, with
   – Specifici per i controlli delle form:
     click, event, submit, enable, disable, value, hasfocus, ch
     ecked, options, selectedOptions, uniqueName
   – Custom
Sintassi del data-bind
• La sintassi di base è:
   data-bind="value: someValue, enable:
   isEnabled, …"
• Si possono usare vari tipi di valori:
   –   Proprietà del ViewModel
   –   Espressione condizionale
   –   Chiamata a funzione del ViewModel
   –   Function expression (funzione inline)
   –   Object literal (solo con il bindings with)
Elementi Virtuali
• I binding di controllo del flusso possono
  essere utilizzati anche senza la presenza di
  un elemento (tag) contenitore:
  <!– ko foreach: items -->
    <span data-bind="text: name"></span>
  <!-- /ko -->
Binding Context
• Il Binding Context è un oggetto che contiene i dati che sono
  referenziati nei bindings della View e a cui si può accedere
  all’interno degli stessi
• Le proprietà più importanti sono:
   –   $parent: il ViewModel genitore (se esiste)
   –   $root: il ViewModel radice
   –   $data: il ViewModel corrente
   –   $index: l’indice dell’elemento corrente in un binding foreach
   –   $element: l’elemento (tag) del markup HTML5 in cui è definito
       l’attributo data-bind corrente
Demo 04

DEMO
Custom bindings
• Oltre ai binding built-in nel framework è possibile
  crearne di nuovi personalizzati
   ko.bindingHandlers.panelVisible = {
       init:
   function(element, valueAccessor, allBindingsAcces
   sor, viewModel) { … },
       update:
   function(element, valueAccessor, allBindingsAcces
   sor, viewModel) { … }
   };
   …
   data-bind="panelVisible: isPanelVisible"
Demo 05

DEMO
Scenari e tecniche avanzate
• In Knockout JS c’è molto di più di quanto visto in
  questa presentazione tra cui:
   – Un motore di templating del markup HTML5
   – Tecniche specifiche di implementazione di librerie
     riutilizzabili di custom bindings
   – Funzioni helper per la gestione degli eventi scatenati
     dagli elementi del markup HTML5
   – L’uso del plugin di mapping
   – Moltissime funzioni di utility (non documentate…)
Q&A
Tutto il materiale di questa sessione su
http://www.communitydays.it/

#CDays13

Mais conteúdo relacionado

Semelhante a Usare Knockout JS

Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockoutDotNetCampus
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Fabio Armani
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
Installing Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansInstalling Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansDavide Nardone
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryAndrea Saltarello
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)Sabino Labarile
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Azure dayroma java, il lato oscuro del cloud
Azure dayroma   java, il lato oscuro del cloudAzure dayroma   java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloudRiccardo Zamana
 
DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)Alessandro Giorgetti
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftStefano Benedetti
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio Gandelli
 
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applicationsDotNetCampus
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Martino Bordin
 
ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)Giorgio Di Nardo
 

Semelhante a Usare Knockout JS (20)

Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockout
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
Knockout.js
Knockout.jsKnockout.js
Knockout.js
 
Powerful asp.net 4 e ie9
Powerful asp.net 4 e ie9Powerful asp.net 4 e ie9
Powerful asp.net 4 e ie9
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
Installing Apache tomcat with Netbeans
Installing Apache tomcat with NetbeansInstalling Apache tomcat with Netbeans
Installing Apache tomcat with Netbeans
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled Repository
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Azure dayroma java, il lato oscuro del cloud
Azure dayroma   java, il lato oscuro del cloudAzure dayroma   java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloud
 
DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applications
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
 
ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)ASP.NET MVC: Andare oltre il 100% (Web@work)
ASP.NET MVC: Andare oltre il 100% (Web@work)
 

Mais de Roberto Messora

Azure Synapse: data lake & modern data warehouse dalla A alla Z
Azure Synapse: data lake &  modern data warehouse dalla A alla ZAzure Synapse: data lake &  modern data warehouse dalla A alla Z
Azure Synapse: data lake & modern data warehouse dalla A alla ZRoberto Messora
 
Azure Data Factory: l'evoluzione della specie della data integration
Azure Data Factory: l'evoluzione della specie della data integrationAzure Data Factory: l'evoluzione della specie della data integration
Azure Data Factory: l'evoluzione della specie della data integrationRoberto Messora
 
Real world Visual Studio Code
Real world Visual Studio CodeReal world Visual Studio Code
Real world Visual Studio CodeRoberto Messora
 
Architetture a Microservizi con Docker Container
Architetture a Microservizi con Docker ContainerArchitetture a Microservizi con Docker Container
Architetture a Microservizi con Docker ContainerRoberto Messora
 
Da JavaScript a TypeScript
Da JavaScript a TypeScriptDa JavaScript a TypeScript
Da JavaScript a TypeScriptRoberto Messora
 
Docker as a hosting target
Docker as a hosting targetDocker as a hosting target
Docker as a hosting targetRoberto Messora
 
Da imperativo a reattivo: Bacon.JS
Da imperativo a reattivo: Bacon.JSDa imperativo a reattivo: Bacon.JS
Da imperativo a reattivo: Bacon.JSRoberto Messora
 
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extension
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extensionEvent streaming pipeline with Windows Azure and ArcGIS Geoevent extension
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extensionRoberto Messora
 
Code quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScriptCode quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScriptRoberto Messora
 
Single Page Applications
Single Page ApplicationsSingle Page Applications
Single Page ApplicationsRoberto Messora
 
Single Page web Application
Single Page web ApplicationSingle Page web Application
Single Page web ApplicationRoberto Messora
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webRoberto Messora
 
Self-adaptive geospatial web applications
Self-adaptive geospatial web applicationsSelf-adaptive geospatial web applications
Self-adaptive geospatial web applicationsRoberto Messora
 
Web technologies and patterns in HTML5 mapping
Web technologies and patterns in HTML5 mappingWeb technologies and patterns in HTML5 mapping
Web technologies and patterns in HTML5 mappingRoberto Messora
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!Roberto Messora
 

Mais de Roberto Messora (18)

Azure Synapse: data lake & modern data warehouse dalla A alla Z
Azure Synapse: data lake &  modern data warehouse dalla A alla ZAzure Synapse: data lake &  modern data warehouse dalla A alla Z
Azure Synapse: data lake & modern data warehouse dalla A alla Z
 
Azure Data Factory: l'evoluzione della specie della data integration
Azure Data Factory: l'evoluzione della specie della data integrationAzure Data Factory: l'evoluzione della specie della data integration
Azure Data Factory: l'evoluzione della specie della data integration
 
Introduzione a Docker
Introduzione a DockerIntroduzione a Docker
Introduzione a Docker
 
Seminario Big Data
Seminario Big DataSeminario Big Data
Seminario Big Data
 
Real world Visual Studio Code
Real world Visual Studio CodeReal world Visual Studio Code
Real world Visual Studio Code
 
Architetture a Microservizi con Docker Container
Architetture a Microservizi con Docker ContainerArchitetture a Microservizi con Docker Container
Architetture a Microservizi con Docker Container
 
Da JavaScript a TypeScript
Da JavaScript a TypeScriptDa JavaScript a TypeScript
Da JavaScript a TypeScript
 
Docker as a hosting target
Docker as a hosting targetDocker as a hosting target
Docker as a hosting target
 
Da imperativo a reattivo: Bacon.JS
Da imperativo a reattivo: Bacon.JSDa imperativo a reattivo: Bacon.JS
Da imperativo a reattivo: Bacon.JS
 
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extension
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extensionEvent streaming pipeline with Windows Azure and ArcGIS Geoevent extension
Event streaming pipeline with Windows Azure and ArcGIS Geoevent extension
 
Code quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScriptCode quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScript
 
Single Page Applications
Single Page ApplicationsSingle Page Applications
Single Page Applications
 
Javascript Unit Testing
Javascript Unit TestingJavascript Unit Testing
Javascript Unit Testing
 
Single Page web Application
Single Page web ApplicationSingle Page web Application
Single Page web Application
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
 
Self-adaptive geospatial web applications
Self-adaptive geospatial web applicationsSelf-adaptive geospatial web applications
Self-adaptive geospatial web applications
 
Web technologies and patterns in HTML5 mapping
Web technologies and patterns in HTML5 mappingWeb technologies and patterns in HTML5 mapping
Web technologies and patterns in HTML5 mapping
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!
 

Usare Knockout JS

  • 1.
  • 2. Grazie a Sponsor
  • 3. Agenda • Knockout JS – Cosa, Quando, Perché – Alternative • Knockout JS: Come – Oggetti observable – Attributi data-bind
  • 4. Che cos’è Knockout JS • Presentation Framework Javascript – Implementazione di un particolare Design Pattern di Presentation (UI): il Model-View-ViewModel (MVVM) – Implementato completamente in Javascript – Multi-Browser (che supporti HTML5) – Convive senza problemi con i maggiori Framework Javascript (jQuery, jQuery Mobile, …) – Portale del progetto http://knockoutjs.com
  • 5. Model-View-ViewModel • Il MVVM fa parte della cosiddetta famiglia dei presentation pattern MV* – disaccoppiare i dati rappresentati nella UI (Model) dalla UI stessa (View) promuovendo una netta separazione fra questi mediante l’uso di un oggetto terzo: il ViewModel
  • 6. Model-View-ViewModel • Si definiscono e si idratano i dati (Model) da visualizzare • Si veicolano i dati attraverso il ViewModel verso la View utilizzando un meccanismo di data-bind che permetta la gestione bidirezionele degli aggiornamenti dei dati stessi • Si definiscono delle operazioni nel ViewModel per gestire gli eventi provenienti dalla View
  • 7. MVVM e HTML5 • View: il markup HTML • Model: uno o più oggetti e array Javascript che contengono solo dati puri e che devono essere rappresentati nella View • ViewModel: un oggetto Javascript che identifica una rappresentazione sotto forma di codice dei dati (Model) e delle operazioni della View
  • 8. Knockout JS e MVVM • Knockout JS si caratterizza principalmente per tre aspetti: – Sintassi specifica per la definizione di un binding dichiarativo dei dati nel markup HTML5 – API Javascript per la definizione delle proprietà dell’oggetto ViewModel che fornisce un meccanismo automatico di notifica del loro aggiornamento – Sintassi di templating di frammenti di markup HTML per il rendering di liste/array
  • 9. Quando usare Knockout JS • Knockout JS offre una API in grado di semplificare e strutturare lo sviluppo di una logica di UI mediamente complessa • L’uso di Knockout JS è indicato quando si affronta lo sviluppo di una Rich Internet Application (RIA) lato client
  • 10. Perché usare Knockout JS • Organizzazione della codebase in termini di responsabilità degli oggetti coinvolti e delle loro interazioni in modo da evitare il più possibile la produzione del cosiddetto codice spaghetti • Gestione strutturata degli elementi e degli eventi del DOM • Possibilità di sviluppare il codice utilizzando facilmente tecniche di Unit Testing
  • 11. Alternative a Knockout JS • Esistono altri Presentation Framework Javascript che: – Si prefiggono gli stessi obiettivi – Fanno parte della famiglia MV* • Per citare i più conosciuti: – BackBone JS – Ember JS – Angular JS
  • 12. Knockout JS in 2 minuti • Definizione di un oggetto ViewModel Javascript con proprietà observable e metodi (command) • Definizione del markup HTML5 con attributi data-bind • Applicazione del ViewModel alla View mediante il metodo ko.applyBindings
  • 14. ViewModel: proprietà osservabili • Knockout JS offre la possibilità di definire le proprietà del ViewModel come oggetti osservabili di tre tipi: – Observable – Computed Observable – Observable Array • Hanno la capacità di notificare automaticamente l’aggiornamento del proprio valore alla View e viceversa
  • 15. Oggetti Observable • Leggerne il valore: var fn = self.firstName( ); • Scriverne il valore: self.firstName("Roberto"); • Chain syntax: self.firstName("Roberto").lastName("Messora"); • Sottoscrizione esplicita: self.firstName.subscribe(function(newValue) { … });
  • 16. Oggetti Computed Observable • Definirne la composizione: self.isMinor = ko.computed(function() { return self.age() < 18; }); • Possono essere concatenati: self.canDrive = ko.computed(function() { return self.isMinor() == false; }); • Possono essere anche in scrittura per scenari come: – Decomposizione dell’input utente – Convertitore di valore/formato – Validatore di input utente • Offrono tutta una serie di metodi e opzioni per un uso avanzato
  • 17. Oggetti Observable Array • Definirne la composizione: self.myArray = ko.observableArray(["a", "b", "c"]); • Ridefiniscono tutti i classici metodi di un normale array: – indexOf, slice – pop, push, shift, unshift, reverse, sort, splice – remove, removeAll, destroy, destroyAll
  • 19. Estendere un Observable • Un oggetto Observable può essere esteso per fornirne ulteriori funzionalità custom • Uno degli utilizzi più utili è quello della validazione delle proprietà del ViewModel ko.extenders.positiveNumberValidation = function(target, option) { … }; … self.age = ko.observable(0).extend({ positiveNumberValidation: "" });
  • 21. View: attributi di data-bind • Knockout JS offre la possibilità di definire un attributo di data-bind nei tag del markup HTML5 • Sono disponibili 4 tipi di famiglie di binding: – Controllo del testo e del rendering: visible, text, html, css, style, attr – Controllo del flusso: foreach, if, ifnot, with – Specifici per i controlli delle form: click, event, submit, enable, disable, value, hasfocus, ch ecked, options, selectedOptions, uniqueName – Custom
  • 22. Sintassi del data-bind • La sintassi di base è: data-bind="value: someValue, enable: isEnabled, …" • Si possono usare vari tipi di valori: – Proprietà del ViewModel – Espressione condizionale – Chiamata a funzione del ViewModel – Function expression (funzione inline) – Object literal (solo con il bindings with)
  • 23. Elementi Virtuali • I binding di controllo del flusso possono essere utilizzati anche senza la presenza di un elemento (tag) contenitore: <!– ko foreach: items --> <span data-bind="text: name"></span> <!-- /ko -->
  • 24. Binding Context • Il Binding Context è un oggetto che contiene i dati che sono referenziati nei bindings della View e a cui si può accedere all’interno degli stessi • Le proprietà più importanti sono: – $parent: il ViewModel genitore (se esiste) – $root: il ViewModel radice – $data: il ViewModel corrente – $index: l’indice dell’elemento corrente in un binding foreach – $element: l’elemento (tag) del markup HTML5 in cui è definito l’attributo data-bind corrente
  • 26. Custom bindings • Oltre ai binding built-in nel framework è possibile crearne di nuovi personalizzati ko.bindingHandlers.panelVisible = { init: function(element, valueAccessor, allBindingsAcces sor, viewModel) { … }, update: function(element, valueAccessor, allBindingsAcces sor, viewModel) { … } }; … data-bind="panelVisible: isPanelVisible"
  • 28. Scenari e tecniche avanzate • In Knockout JS c’è molto di più di quanto visto in questa presentazione tra cui: – Un motore di templating del markup HTML5 – Tecniche specifiche di implementazione di librerie riutilizzabili di custom bindings – Funzioni helper per la gestione degli eventi scatenati dagli elementi del markup HTML5 – L’uso del plugin di mapping – Moltissime funzioni di utility (non documentate…)
  • 29. Q&A Tutto il materiale di questa sessione su http://www.communitydays.it/ #CDays13

Notas do Editor

  1. Inserite l’eventuale vostro logo in basso a destra
  2. Slide da mostrare prima di iniziare la sessione – non rimuovere!
  3. Ultima slide, obbligatoria