SlideShare una empresa de Scribd logo
1 de 21
Introducción a KNOCKOUT
Oscar Gensollen Arroyo
Arquitecto de Software
Consultor Senior
www.formativa.com.pe
oscar.gensollen@formativa.com.pe
@oscargensollen
Agenda
 ¿Qué es Knockout?
 Patrón MVVM.
 Creación de ViewModel y una View.
 Uso de Observables simples y calculados.
 Uso de Bindings
 Control de texto.
 Apariencia.
 Formularios.
 Control de flujo.
¿Qué es Knockout?
 Es una librería basada en JavaScript que permite crear interfaces de rápida
respuesta con un modelo limpio.
 Basada en el patron MVVM en tiempo real con sintáxis declarativa.
 Tres elementos fundamentales:
 Observables.
 Bindings.
 Templating.
 Es 100% lado cliente, pudiendo trabajar con cualquier tecnología del lado
servidor.
 Compacta (~13kb) y multinavegador (IE6+,FF2+,Chrome,Safari).
 Se complementa muy bien con otras librerías como jQuery.
 Ideal para UIs que se van hacienda complejas y deben adquirir
comportamientos basados en datos.
 No tiene dependencias.
Aplicacion knockoutjs típica
 Lado Cliente (MVVM):
 View(s) -> Bindings
 Model(s) -> Observables
 ViewModel(s) -> Funciones
 Lado Servidor:
 Endpoints RESTful
JSON
Componentes de Knockout
View ModelViewModel
Data-binding
Empezando con Knockout
1. Lo descargamos desde http://knockoutjs.com/downloads/index.html
2. Referenciamos la librería
CDNs
http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js
http://cdnjs.cloudflare.com/ajax/libs/knockout/3.1.0/knockout-min.js
M-V-VM
 Patrón de diseño para interfaces, formado por:
 Un Modelo
 Representa objetos y operaciones del dominio.
 Independientes de la UI.
 Un View Model:
 Representación de código de los datos y operaciones a nivel de UI.
 Son 100% JavaScript, no HTML.
 Una View:
 Visible e interactiva representación del estado del ViewModel.
 Muestra información desde el VM, envía comandos y actualiza el estado cuando el
VM cambia.
Creación de un ViewModel
 Es igual a crear un Modelo, solo que adicionamos otro componente de KO que
son los observables.
 Ejemplo de un ViewModel:
var RegistrarClienteViewModel = {
Nombres: ko.observable(),
Apellidos: ko.observable(),
btnRegistrar: function(){
$.ajax(…
};
Creación de una View
 Se usa HTML normal combinado con expresiones de data-binding, empleando el
atributo “data-bind”:
<form id=“clienteForm" name=“clienteForm" method="POST">
<div>
<label class="form-label">Nombres:</label>
<input type="text" id="txtNombre"
name="txtNombre" data-bind="value:Nombre" />
</div>
<div>
<input type="button" id="btnSubmit"
value="Submit" data-bind = "click: submit" />
</div>
Activando Knockout
 Se debe activar KO para que el navegador reconozca los atributos “data-
bind”:
ko.applyBindings(RegistrarClienteViewModel);
 La activación se puede hacer para determinada zona (divCabecera en este
ejemplo):
ko.applyBindings(RegistrarClienteViewModel,
document.getElementById(‘divCabecera’);
Observables
 Son objetos JavaScript que notifican sobre cambios realizados sobre una
determinada propiedad.
 Normalmente el subscriptor principal es la View.
 También pueden identificar dependencias.
 Se implementan como funciones para ser compatibles con diferentes
navegadores.
Observables Simples
var ProductoViewModel = {
Color: ko.observable(‘Azul’),
Precio: ko.observable()
};
Observables y Notificaciones
 Los observables son “observados” mediante expresiones de enlace:
<input type=“text” id=“txtNombre” name=“txtNombre”
data-bind=“text: Nombre” />
 Cuando el valor de la propiedad cambia:
productoViewModel.Nombre(“Gaseosa”)
 El enlace hace que el cambio se aplique en el elemento DOM
correspondiente.
Observables Calculados
 Son funciones que dependen de uno o más observables.
 Se actualizan automáticamente cuando cualquiera de las dependencias
cambia.
function ProductoViewModel(){
// ...
this.NombreCompleto = ko.computed(function() {
return this.Nombre() + ‘ ‘ + this.Apellido();
}, this);
}
<span data-bind=“text: NombreCompleto”></span>
Bindings
 Son expresiones que permiten enlazar un elemento del DOM o una propiedad
de éste a una propiedad del ViewModel.
 Se definen en el mismo elemento usando el atributo “data-bind”.
<div data-bind=“visible: mostrarMensaje></div>
 Existen diferentes categorías como:
 Control de texto y apariencia.
 Campos de formulario.
 Control de flujo.
Bindings: Control de Texto y Apariencia
 visible, text, html, css, style, attr
<div data-bind=“visible: mostrarMensaje></div>
<span data-bind=“text: Marca”></span>
<div data-bind=“html: detalles”></div>
<div data-bind=“css: estadoGanancia”></div>
<div data-bind=“style: { color: gananciaActual() < 0 ?
‘red’ : ‘black’ }”></div>
<a data-bind=“attr: { href: url, title: detalles }”>
Bindings: Campos de formulario (1)
 click, event, submit, enable, disable, value, hasFocus, checked, options,
selectedOptions, uniqueName
<button data-bind=“click: registrarProducto></button>
<div data-bind=“event: { mouseover: mostrarDetalle,
mouseour: ocultarDetalle }”></span>
<form data-bind=“submit: procesarPedido”>...
<input type=“text” data-bind=“enable:
tieneCelular”></input>
Bindings: Campos de formulario (2)
 click, event, submit, enable, disable, value, hasFocus, checked, options,
selectedOptions, uniqueName
<input type=“checkbox” data-bind=“checked:
quiereRecibirBoletin”></input>
<select data-bind=“options: listaPaises, optionText:
‘nombrePais’, value: paisSeleccionado, optionsCaption:
‘Seleccione’></select>
Bindings: Control de Flujo (1)
 foreach, if, ifnot, with
<table>
<thead>
<tr><th>Nombre</th><th>Apellido</th></tr>
</thead>
<tbody data-bind="foreach: clientes">
<tr>
<td data-bind="text: nombre"></td>
<td data-bind="text: apellido"></td>
</tr>
</tbody>
</table>
Bindings: Control de Flujo (2)
 foreach, if, ifnot, with
<div data-bind="if: tieneBono">
Bono: <b data-bind="text: bono.Monto"> </b>
</div>
<p data-bind="with: posicion">
Latitud: <span data-bind="text: latitud">
</span>,
Longitud: <span data-bind="text: longitud">
</span>
</p>
 Charla (grabación):
https://www.dropbox.com/sh/khkz88ys9ybcu82/fg-yKFB2ST
 Demos (jsfiddle.net):
 a. Bindings simples y computed
http://jsfiddle.net/ogensollen/Jk5nv/
 b. Agregar elementos a una coleccion
http://jsfiddle.net/ogensollen/qswVR/1/
 c. Campos de formulario
http://jsfiddle.net/ogensollen/Kp8bz/
 d. Caso: reservaciones
http://jsfiddle.net/ogensollen/6muue/4/
 e. Caso: lista de contactos
http://jsfiddle.net/ogensollen/GRy86/1/
 Oscar Gensollen Arroyo
Arquitecto de Software
Consultor Senior
www.formativa.com.pe
oscar.gensollen@formativa.com.pe
@oscargensollen

Más contenido relacionado

La actualidad más candente

Analysis and design of Online stock trading software
Analysis and design of Online stock trading softwareAnalysis and design of Online stock trading software
Analysis and design of Online stock trading software
daksh bhatt
 
Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)
club23
 

La actualidad más candente (20)

JavaScript Variables
JavaScript VariablesJavaScript Variables
JavaScript Variables
 
HTML CSS and Web Development
HTML CSS and Web DevelopmentHTML CSS and Web Development
HTML CSS and Web Development
 
Buddhism
BuddhismBuddhism
Buddhism
 
Getting into HTML
Getting into HTMLGetting into HTML
Getting into HTML
 
Html ppt
Html pptHtml ppt
Html ppt
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
Intro Html
Intro HtmlIntro Html
Intro Html
 
ASP, ASP.NET, JSP, COM/DCOM
ASP, ASP.NET, JSP, COM/DCOMASP, ASP.NET, JSP, COM/DCOM
ASP, ASP.NET, JSP, COM/DCOM
 
Chapter 3: Simplification of Boolean Function
Chapter 3: Simplification of Boolean FunctionChapter 3: Simplification of Boolean Function
Chapter 3: Simplification of Boolean Function
 
Nyaya Philosophy .pdf
Nyaya Philosophy .pdfNyaya Philosophy .pdf
Nyaya Philosophy .pdf
 
Analysis and design of Online stock trading software
Analysis and design of Online stock trading softwareAnalysis and design of Online stock trading software
Analysis and design of Online stock trading software
 
Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)
 
Web Technology Lab File
Web Technology Lab FileWeb Technology Lab File
Web Technology Lab File
 
Compiler design Introduction
Compiler design IntroductionCompiler design Introduction
Compiler design Introduction
 
HTML (Web) basics for a beginner
HTML (Web) basics for a beginnerHTML (Web) basics for a beginner
HTML (Web) basics for a beginner
 
Bootstrap.pptx
Bootstrap.pptxBootstrap.pptx
Bootstrap.pptx
 
CSS for Beginners
CSS for BeginnersCSS for Beginners
CSS for Beginners
 
Html forms
Html formsHtml forms
Html forms
 
HTML5 &CSS: Chapter 08
HTML5 &CSS: Chapter 08HTML5 &CSS: Chapter 08
HTML5 &CSS: Chapter 08
 
Flask – Python
Flask – PythonFlask – Python
Flask – Python
 

Similar a Introducción a Knockout

Taller MVVM Imagine Camp Medellín (Intermedio)
Taller MVVM Imagine Camp Medellín (Intermedio)Taller MVVM Imagine Camp Medellín (Intermedio)
Taller MVVM Imagine Camp Medellín (Intermedio)
Sorey García
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Sorey García
 

Similar a Introducción a Knockout (20)

ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVC
 
Taller MVVM Imagine Camp Medellín (Intermedio)
Taller MVVM Imagine Camp Medellín (Intermedio)Taller MVVM Imagine Camp Medellín (Intermedio)
Taller MVVM Imagine Camp Medellín (Intermedio)
 
NET MAUI Terasoft.pptx
NET MAUI Terasoft.pptxNET MAUI Terasoft.pptx
NET MAUI Terasoft.pptx
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a Backbone
 
5-Unidad 2: Diseños de Vista-2.2 Para Web
5-Unidad 2: Diseños de Vista-2.2 Para Web5-Unidad 2: Diseños de Vista-2.2 Para Web
5-Unidad 2: Diseños de Vista-2.2 Para Web
 
Esencia de web components
Esencia de web componentsEsencia de web components
Esencia de web components
 
Introduccion a j query
Introduccion a j queryIntroduccion a j query
Introduccion a j query
 
Trucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.FormsTrucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.Forms
 
Esencia de Web Components
Esencia de Web ComponentsEsencia de Web Components
Esencia de Web Components
 
Angularjs
AngularjsAngularjs
Angularjs
 
ABI-Box
ABI-BoxABI-Box
ABI-Box
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Guía Practica conexión BD 2021
Guía Practica conexión BD  2021Guía Practica conexión BD  2021
Guía Practica conexión BD 2021
 
5-Unidad 2: Diseño de Vista-2.2 Para Web
5-Unidad 2: Diseño de Vista-2.2 Para Web5-Unidad 2: Diseño de Vista-2.2 Para Web
5-Unidad 2: Diseño de Vista-2.2 Para Web
 
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
 
06. jsf (java server faces) (1)
06. jsf (java server faces) (1)06. jsf (java server faces) (1)
06. jsf (java server faces) (1)
 
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
 
patron de diseño MVVMo.pptx
patron de diseño MVVMo.pptxpatron de diseño MVVMo.pptx
patron de diseño MVVMo.pptx
 

Introducción a Knockout

  • 1. Introducción a KNOCKOUT Oscar Gensollen Arroyo Arquitecto de Software Consultor Senior www.formativa.com.pe oscar.gensollen@formativa.com.pe @oscargensollen
  • 2. Agenda  ¿Qué es Knockout?  Patrón MVVM.  Creación de ViewModel y una View.  Uso de Observables simples y calculados.  Uso de Bindings  Control de texto.  Apariencia.  Formularios.  Control de flujo.
  • 3. ¿Qué es Knockout?  Es una librería basada en JavaScript que permite crear interfaces de rápida respuesta con un modelo limpio.  Basada en el patron MVVM en tiempo real con sintáxis declarativa.  Tres elementos fundamentales:  Observables.  Bindings.  Templating.  Es 100% lado cliente, pudiendo trabajar con cualquier tecnología del lado servidor.  Compacta (~13kb) y multinavegador (IE6+,FF2+,Chrome,Safari).  Se complementa muy bien con otras librerías como jQuery.  Ideal para UIs que se van hacienda complejas y deben adquirir comportamientos basados en datos.  No tiene dependencias.
  • 4. Aplicacion knockoutjs típica  Lado Cliente (MVVM):  View(s) -> Bindings  Model(s) -> Observables  ViewModel(s) -> Funciones  Lado Servidor:  Endpoints RESTful JSON
  • 5. Componentes de Knockout View ModelViewModel Data-binding
  • 6. Empezando con Knockout 1. Lo descargamos desde http://knockoutjs.com/downloads/index.html 2. Referenciamos la librería CDNs http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js http://cdnjs.cloudflare.com/ajax/libs/knockout/3.1.0/knockout-min.js
  • 7. M-V-VM  Patrón de diseño para interfaces, formado por:  Un Modelo  Representa objetos y operaciones del dominio.  Independientes de la UI.  Un View Model:  Representación de código de los datos y operaciones a nivel de UI.  Son 100% JavaScript, no HTML.  Una View:  Visible e interactiva representación del estado del ViewModel.  Muestra información desde el VM, envía comandos y actualiza el estado cuando el VM cambia.
  • 8. Creación de un ViewModel  Es igual a crear un Modelo, solo que adicionamos otro componente de KO que son los observables.  Ejemplo de un ViewModel: var RegistrarClienteViewModel = { Nombres: ko.observable(), Apellidos: ko.observable(), btnRegistrar: function(){ $.ajax(… };
  • 9. Creación de una View  Se usa HTML normal combinado con expresiones de data-binding, empleando el atributo “data-bind”: <form id=“clienteForm" name=“clienteForm" method="POST"> <div> <label class="form-label">Nombres:</label> <input type="text" id="txtNombre" name="txtNombre" data-bind="value:Nombre" /> </div> <div> <input type="button" id="btnSubmit" value="Submit" data-bind = "click: submit" /> </div>
  • 10. Activando Knockout  Se debe activar KO para que el navegador reconozca los atributos “data- bind”: ko.applyBindings(RegistrarClienteViewModel);  La activación se puede hacer para determinada zona (divCabecera en este ejemplo): ko.applyBindings(RegistrarClienteViewModel, document.getElementById(‘divCabecera’);
  • 11. Observables  Son objetos JavaScript que notifican sobre cambios realizados sobre una determinada propiedad.  Normalmente el subscriptor principal es la View.  También pueden identificar dependencias.  Se implementan como funciones para ser compatibles con diferentes navegadores.
  • 12. Observables Simples var ProductoViewModel = { Color: ko.observable(‘Azul’), Precio: ko.observable() };
  • 13. Observables y Notificaciones  Los observables son “observados” mediante expresiones de enlace: <input type=“text” id=“txtNombre” name=“txtNombre” data-bind=“text: Nombre” />  Cuando el valor de la propiedad cambia: productoViewModel.Nombre(“Gaseosa”)  El enlace hace que el cambio se aplique en el elemento DOM correspondiente.
  • 14. Observables Calculados  Son funciones que dependen de uno o más observables.  Se actualizan automáticamente cuando cualquiera de las dependencias cambia. function ProductoViewModel(){ // ... this.NombreCompleto = ko.computed(function() { return this.Nombre() + ‘ ‘ + this.Apellido(); }, this); } <span data-bind=“text: NombreCompleto”></span>
  • 15. Bindings  Son expresiones que permiten enlazar un elemento del DOM o una propiedad de éste a una propiedad del ViewModel.  Se definen en el mismo elemento usando el atributo “data-bind”. <div data-bind=“visible: mostrarMensaje></div>  Existen diferentes categorías como:  Control de texto y apariencia.  Campos de formulario.  Control de flujo.
  • 16. Bindings: Control de Texto y Apariencia  visible, text, html, css, style, attr <div data-bind=“visible: mostrarMensaje></div> <span data-bind=“text: Marca”></span> <div data-bind=“html: detalles”></div> <div data-bind=“css: estadoGanancia”></div> <div data-bind=“style: { color: gananciaActual() < 0 ? ‘red’ : ‘black’ }”></div> <a data-bind=“attr: { href: url, title: detalles }”>
  • 17. Bindings: Campos de formulario (1)  click, event, submit, enable, disable, value, hasFocus, checked, options, selectedOptions, uniqueName <button data-bind=“click: registrarProducto></button> <div data-bind=“event: { mouseover: mostrarDetalle, mouseour: ocultarDetalle }”></span> <form data-bind=“submit: procesarPedido”>... <input type=“text” data-bind=“enable: tieneCelular”></input>
  • 18. Bindings: Campos de formulario (2)  click, event, submit, enable, disable, value, hasFocus, checked, options, selectedOptions, uniqueName <input type=“checkbox” data-bind=“checked: quiereRecibirBoletin”></input> <select data-bind=“options: listaPaises, optionText: ‘nombrePais’, value: paisSeleccionado, optionsCaption: ‘Seleccione’></select>
  • 19. Bindings: Control de Flujo (1)  foreach, if, ifnot, with <table> <thead> <tr><th>Nombre</th><th>Apellido</th></tr> </thead> <tbody data-bind="foreach: clientes"> <tr> <td data-bind="text: nombre"></td> <td data-bind="text: apellido"></td> </tr> </tbody> </table>
  • 20. Bindings: Control de Flujo (2)  foreach, if, ifnot, with <div data-bind="if: tieneBono"> Bono: <b data-bind="text: bono.Monto"> </b> </div> <p data-bind="with: posicion"> Latitud: <span data-bind="text: latitud"> </span>, Longitud: <span data-bind="text: longitud"> </span> </p>
  • 21.  Charla (grabación): https://www.dropbox.com/sh/khkz88ys9ybcu82/fg-yKFB2ST  Demos (jsfiddle.net):  a. Bindings simples y computed http://jsfiddle.net/ogensollen/Jk5nv/  b. Agregar elementos a una coleccion http://jsfiddle.net/ogensollen/qswVR/1/  c. Campos de formulario http://jsfiddle.net/ogensollen/Kp8bz/  d. Caso: reservaciones http://jsfiddle.net/ogensollen/6muue/4/  e. Caso: lista de contactos http://jsfiddle.net/ogensollen/GRy86/1/  Oscar Gensollen Arroyo Arquitecto de Software Consultor Senior www.formativa.com.pe oscar.gensollen@formativa.com.pe @oscargensollen