# Knockout (web framework)

Knockout è una libreria JavaScript che permette la creazione di siti web dotati di una interfaccia utente ricca e dinamica, basata su un sottostante modello di dati. Implementa il Model-view-viewmodel (MVVM), un design pattern che prevede una netta separazione tra dati (Model), interfaccia utente (View) e la modalità con la quale i dati vengono rappresentati (ViewModel).
È un progetto indipendente e open source sviluppato e mantenuto da Steve Sanderson, un dipendente di Microsoft. Come ha detto l'autore, «(Knockout) continuerà esattamente così com'è e si evolverà in qualunque direzione dove io e la sua comunità di utenti desidereremo portarlo» e, ha sottolineato, «non è un prodotto Microsoft».

## Download e inclusione nella pagina

La libreria è disponibile al download sia dal sito principale che dai principali package manager per JavaScript, come per esempio npm e NuGet. È inoltre disponibile nei principali CDN.
Per poter usufruire della libreria è sufficiente includerla nella pagina in questo modo:
dove x.y.z è la versione che si intende utilizzare. In alternativa, Knockout supporta il caricamento asincrono AMD tramite RequireJs.
Dopo aver caricato la libreria sarà possibile riferirsi ad essa attraverso la variabile globale ko.

## MVVM
### Model

Di solito i dati sono forniti da un server web mediante richieste AJAX, in altri casi potrebbero già essere definiti nel codice JavaScript della pagina oppure inseriti manualmente dall'utente. Indipendentemente dalla loro origine, i dati vengono conservati nella memoria del browser web attraverso le consuete variabili di JavaScript, tipicamente object e array.

### View

In Knockout l'interfaccia utente, scritta in HTML, fa uso di una sintassi dichiarativa basata sull'attributo data-bind="...". Come suggerisce il nome, con questo attributo è possibile impostare uno o più binding tra una proprietà dell'elemento HTML (per esempio il testo contenuto o il valore di un suo attributo) e una specifica proprietà del ViewModel.

### ViewModel

Il ViewModel rappresenta l'anello di congiunzione tra il Model e la View. Si tratta di un oggetto JavaScript che mette a disposizione particolari function definite in gergo observable, ossia osservabili.
Oltre alle proprietà osservabili, che di prassi conservano il nome della proprietà originale del model, Knockout mette a disposizione le proprietà calcolate (computed). Si tratta di funzioni che sono dipendenti da una o più proprietà osservabili e che saranno automaticamente aggiornate ogni qualvolta una qualsiasi delle sue dipendenze cambia di valore.
Con la chiamata del metodo ko.applyBindings(ds) si avvia in modo esplicito il binding, che verrà applicato a tutta la pagina HTML. Il metodo prevede anche un secondo parametro opzionale, che permette di specificare l'elemento della pagina al quale applicare il binding:
In questo modo è possibile applicare dei binding indipendenti a differenti parti della pagina.

## Binding

I binding standard messi a disposizione da Knockout coprono quasi tutti gli ambiti:
* Controllo del testo e dell'apparenza: visible, hidden, text, html, class, css, style, attr.
* Controllo del flusso: foreach, if, ifnot, with, using, let, component.
* Interazione con i campi di un form: click, event, submit, enable, disable, value, textInput, hasFocus, checked, options, selectedOptions, uniqueName.
Inoltre è possibile definire dei binding personalizzati (custom bindings), per sopperire alle eventuali lacune dei binding standard o per incapsulare dei comportamenti sofisticati in una comoda e sintetica voce.

## Component

In alcuni siti è necessario utilizzare la medesima porzione di codice HTML in svariate pagine e in certi casi anche più volte nella stessa pagina. Si pensi ad esempio al sistema per aggiungere un prodotto al carrello di un sito e-commerce, composto da una casella di testo dove l'utente digita la quantità e da un pulsante di conferma. Knockout mette a disposizione un metodo per definire dei componenti riutilizzabili, formati da una propria parte visuale (template) ed eventualmente anche da una propria parte logica sottostante (viewModel). In questo esempio si registra il componente 'add-to-cart':
Dopo aver registrato un componente, questo potrà essere utilizzato nel codice HTML della pagina attraverso lo speciale binding component:
Nell'esempio, la seconda riga mostra la sintassi che permette di passare dei parametri aggiuntivi al componente.
Con l'esecuzione del metodo applyBindings, Knockout inietta all'interno del tag il codice HTML definito nella proprietà template del componente.

### Elementi personalizzati

Un componente può essere utilizzato come se si trattasse di un tag HTML personalizzato: