{"id":12031,"date":"2016-11-24T10:38:55","date_gmt":"2016-11-24T09:38:55","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12031"},"modified":"2016-11-24T10:39:58","modified_gmt":"2016-11-24T09:39:58","slug":"introduzione-a-knockout-js","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/introduzione-a-knockout-js\/","title":{"rendered":"Introduzione a Knockout.js"},"content":{"rendered":"<p>Al giorno d&#8217;oggi, il linguaggio Javascript permette alle pagine web di fare ben altro che comuni interazioni lato client. Una delle attivit\u00e0 sicuramente\u00a0in voga al momento \u00e8 <strong>lo\u00a0sviluppo di\u00a0web app<\/strong>,\u00a0una tipologia di applicazione informatica che vive all&#8217;interno di un browser, viene invocata come una normale pagina web, ma contiene codice Javascript con cui l&#8217;utente interagisce con un sistema remoto, tipicamente un <em>backend<\/em> su server che offre API in rete. Ci\u00f2 che anima le web app sono framework Javascript che offrono funzionalit\u00e0 interessanti, architetture applicative in cui disporre componenti in modo da offrire efficienza per l&#8217;utente e produttivit\u00e0 per il programmatore. Oggi iniziamo a conoscerne uno molto diffuso e apprezzato da anni: <a href=\"http:\/\/knockoutjs.com\/index.html\" target=\"_blank\"><strong>Knockout.js<\/strong><\/a>.<\/p>\n<h2>Knockout.js: caratteristiche e vantaggi<\/h2>\n<p>Innanzitutto non dobbiamo confondere Knockout.js con altre librerie fondamentali come jQuery che nasce con lo scopo di semplificare l&#8217;accesso alla struttura DOM della pagina web. Knockout.js offre un insieme di strumenti applicativi per diminuire \u00a0notevolmente la quantit\u00e0 di codice da scrivere.<\/p>\n<p>Un elemento che l&#8217;ha reso famoso \u00e8 il <strong>data-binding<\/strong>, con cui possiamo legare tra loro un elemento visuale &#8211; pensiamo ad un campo input di un form &#8211; ed una variabile del codice Javascript. Il loro legame sar\u00e0 bidirezionale pertanto il valore della variabile apparir\u00e0 sempre aggiornato\u00a0nell&#8217;elemento visuale seguendone ogni\u00a0modifica e, analogamente, ogni nuovo input inserito tramite il medesimo campo form verr\u00e0 immediatamente immesso\u00a0nella variabile. Se si pensa al tempo speso per anni a passare valori dal form alle variabili e viceversa si intuisce quanto il data binding acceleri il lavoro dello sviluppatore.<\/p>\n<p>Il modo in cui vengono mantenute queste dipendenze \u00e8 l&#8217;utilizzo di un particolare tipo di oggetti detti <strong>observables<\/strong>: una volta che un elemento della pagina viene\u00a0definito &#8220;osservabile&#8221;, Knockout.js segue\u00a0l&#8217;evoluzione dei suoi valori e attua\u00a0le modifiche di cui l&#8217;abbiamo\u00a0incaricato in base alla configurazione assegnata\u00a0al data-binding.<\/p>\n<p>L&#8217;architettura posta alla base di Knockout.js &#8211; adottata con successo\u00a0da altri ottimi framework Javascript &#8211; \u00e8 il <strong>Model-View-ViewModel<\/strong> che permette di gestire in maniera strutturata l&#8217;interfaccia utente per\u00a0tutto il suo ciclo di vita, dalla prima visualizzazione fino al termine del suo utilizzo.<\/p>\n<p>Iniziamo ad usare Knockout.js con un primo esempio di <em>data-binding<\/em>. Innanzitutto scarichiamo\u00a0il framework: possiamo farlo manualmente dal sito ufficiale o tramite <em>bower<\/em>, le istruzioni delle diverse possibilit\u00e0 sono comunque contenute nell&#8217;apposita <a href=\"http:\/\/knockoutjs.com\/downloads\/index.html\" target=\"_blank\">pagina dei Downloads<\/a>\u00a0dal sito ufficiale del progetto. Knockout.js \u00e8 una libreria in puro Javascript quindi non necessita di ulteriori dipendenze.<\/p>\n<h2>L&#8217;esempio: Echo app<\/h2>\n<p>L&#8217;esempio che proponiamo qui \u00e8 un classico Echo: scriviamo qualcosa in un campo, il suo valore viene automaticamente riflesso in un altro campo. Questo funzionamento, seppur semplice, richiederebbe alcune\u00a0righe di codice Javascript, magari\u00a0addolcite dall&#8217;utilizzo di jQuery: qui il funzionamento sar\u00e0 automatico tramite il data-binding di Knockout.js.<\/p>\n<p>Questo il codice HTML\/Javascript che useremo:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;html&gt;\r\n&lt;head&gt;\r\n\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;p&gt;Scrivi qua: &lt;input data-bind=\"value: cosascrivi\"&gt;&lt;\/input&gt;&lt;\/p&gt;\r\n&lt;p&gt;Leggi qua: &lt;span data-bind=\"text: cosaleggi\"&gt;&lt;\/span&gt;&lt;\/p&gt;\r\n&lt;script type='text\/javascript' src=\"js\/knockout-3.4.0.js\"&gt;&lt;\/script&gt;\r\n  &lt;script type='text\/javascript'&gt;\r\n\r\n  function viewModel(){\r\n  cosascrivi=ko.observable(\"testo di esempio\");\r\n  cosaleggi=ko.computed(function(){ return cosascrivi();});\r\n}\r\n\r\n  ko.applyBindings(viewModel);\r\n  &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Nel codice troviamo, due semplici campi HTML, seguiti dal codice Javascript che inizia proprio con l&#8217;inclusione della versione di Knockout.js che abbiamo\u00a0scaricato.<\/p>\n<p>Notiamo, per prima cosa, che i due elementi HTML inseriti consistono uno in\u00a0un campo, in cui inseriremo un valore, e l&#8217;altro in uno span che delimita l&#8217;area in cui vorremo vedere apparire lo stesso valore. Questi due elementi sono contraddistinti dall&#8217;attributo <em>data-binding<\/em> richiesto dalla libreria. Come si pu\u00f2 vedere il suo valore \u00e8 composto da due parti:<\/p>\n<pre class=\"lang:js decode:true \">&lt;input data-bind=\"value: cosascrivi\"&gt;<\/pre>\n<p>La prima parte indica il tipo di data-binding da attuare &#8211; in questo caso <em>value &#8211;<\/em>\u00a0che indica un valore raccolto in input che verr\u00e0 passato ad una variabile Javascript: tale variabile sar\u00e0 quella indicata nella seconda parte del valore, in questo caso si chiama\u00a0<em>cosascrivi<\/em>.<\/p>\n<p>Il binding dell&#8217;elemento span sar\u00e0 invece di tipo <em>text<\/em> in quanto ricever\u00e0 un valore dalla variabile indicata, di nome <em>cosaleggi<\/em>.<\/p>\n<p>Le variabili in questione saranno definite nel <strong>ViewModel<\/strong> scritto in Javascript: lo si pu\u00f2 fare come funzione &#8211; come abbiamo fatto noi &#8211; o sotto forma di oggetto.<\/p>\n<p>Per definire un ViewModel dobbiamo intanto specificare quali variabili saranno degli observable: lo facciamo tramite il metodo <em>observable<\/em>, messo a disposizione dall&#8217;<strong>oggetto ko<\/strong> che per noi rappresenta il punto di accesso al framework Knockout.js.<\/p>\n<p>Notiamo che il secondo oggetto &#8220;osservabile&#8221; \u00e8 creato tramite il metodo <em>computed<\/em> in quanto viene calcolato di volta in volta: in questo caso il calcolo \u00e8 la semplice restituzione del valore impresso nella variabile <em>cosascrivi<\/em> ma potrebbe essere un&#8217;operazione di qualsiasi genere.<\/p>\n<p>Fondamentale ricordare alla fine di invocare il metodo <em>applyBindings<\/em> che determina l&#8217;aggancio tra ViewModel e interfaccia.<\/p>\n<p>In questo tutorial, abbiamo conosciuto il data-binding di Knockout.js apprendendone i principi base con un esempio molto semplice: prossimamente, ne approfondiremo lo studio vedendolo al lavoro in una web app dal funzionamento pi\u00f9 completo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al giorno d&#8217;oggi, il linguaggio Javascript permette alle pagine web di fare ben altro che comuni interazioni&#8230;<\/p>\n","protected":false},"author":561,"featured_media":12589,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1538,1699,1700,16,1598],"class_list":["post-12031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-javascript","tag-knockout-js","tag-single-page-application","tag-web-app","tag-web-developers"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=12031"}],"version-history":[{"count":11,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12031\/revisions"}],"predecessor-version":[{"id":12590,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12031\/revisions\/12590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/12589"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}