¿Que aporta knockout la programación?
Si bien para tener vistas mas dinámicas me alcanzaba con jquery, el aporte del knockout está en no tener que manipular el DOM artesanalmente sino que de eso se encarga knockout en base a losdata-bind
que nosotros definimos.¿Que conceptos se agregan respecto de la simple manipulación del DOM?
Se agrega el concepto de view-model observable, uno de los pilares de knockout (sinó "el" pilar).Ejemplo completo
Este ejemplo utiliza mongolab y funciona simplemente abriendo el html desde el filesystem con un browser, no necesita hosting del sitio web (a los fines didáctico).
Para configurar mongolab, siga los pasos descriptos en readme.txt
Conceptos claves
- Separar correctamente lo que corresponde a la vista de lo que corresponde al view-model
- Utilizar los
data-bind
para vicular atributos de html con propiedades del view-model o para iterar como el caso dedata-bind="foreach: articles"
- Todo lo que queremos que se actualice 'automáticamente' debe ser
ko.observable(...)
, ya sean objetos, propiedades, arrays
Analizando algunos fragmentos de código
Para inicializar todos nuestros bindings, tenemos que ejecutar ko.applyBindings
luego de que se cargó nuestra página:
Para relacionar un objeto de nuestro view-model con los elementos html debemos utilizar los data-bind
, por ejemplo:
donde:
- El
data-bind
delform
indica que cuando se haga un submit de este form, se ejecute el métodoadd
de nuestro view-model y que losdata-bind
internos del form trabajan con el objetonewItem
de nuestro view-model - El
data-bind
delinput id="new_name"
está indicando que la propiedad relacionada con elvalue
de ese input esname
. ¿de quien?, si, denewItem
y por último, veamos como iterar en un array de items:
- en primer lugar podemos ver la propiedad
length
bindeada al contenido del elementospan
. - luego, podemos observar un elemento
ul
cuyodata-bind
nos dice que va a recorrer el arrayarticles
de nuestro view-model. - ahora bien, dentro de cada
li
vamos a tener 2 elementos de tipospan
que van a estar relacionados con las propiedadesname
ystock
de la misma manera que elspan
anterior pero con la salvedad que estos están vinculados a cada elemento del array que estamos iterando. También tendremos 2 elementos de tipobutton
y, como podemos intuir deldata-bind
cuando se presionen invocarán a los métodosset_current
yremove
de nuestro view-model (y no del elemento que estamos iterando, para eso es el$parent
)
Y... ¿el view-model?
Ahora veremos algunos fragmentos que considero importantes del view-model, pero pueden verlo completo bajándose el ejemplo.
Aquí podemos observar como creamos el view-model (self
) creando articles
como un array observable y newItem
como un objeto observable. Luego definimos length
como una propiedad computable.
function articulos() { var self = { }; self.articles = ko.observableArray(); self.newItem = ko.observable(); self.length = ko.computed(function() { return self.articles().length; });
Aquí podemos observar la definición de add
, el parámetro f
es el form
involucrado, las primeras líneas son para validarlo (jquery.validation), luego tomamos el action
definido en el form
asumiendo que ese es el nombre de la colección a la que queremos agregar el nuevo elemento y llamamos a hacer un $.post
con self.newItem()
como contenido y, de resultar exitoso el POST, se agrega la respuesta (data
) a la colección de articles
, previo crearla como observable.
self.add = function(f) { var form = $(f); var valid = true; if (form.valid !== undefined) valid = form.valid(); if (valid === undefined || valid) { var collectionName = form.attr("action"); rest.dopost(collectionName, self.newItem(), function(data) { self.articles.push(observableArticulo(data)); self.reset_newItem(); self.sort(); }); } return false; };
Interesante articulo! Grande Nelo!
ResponderBorrarYo hace ya un tiempito que empece a usarlo y la verdad que es un muy buen recurso complementado con jquery y json para hacer web mas ágiles.
Interesante el comentari respecto que ya viene incluido con el asp.net mvc4.
Excelente articulo!
Muy buena la nota Nelo, otra cosa que estudiar..
ResponderBorrarBuenos días. Tengo una duda sobre la implementación de Knockout en asp.net MVC.
ResponderBorrarSupongamos que tengo un observableArray llamado Producto:
function ViewModel() {
self.Producto = ko.observableArray([]);
...
Dicho array contiene un par de propiedades (por ejemplo "imprimir" y "imprimirEnNegrita".
Lo que deseo es que el checkbox correspondiente a "imprimirEnNegrita" esté "enable" cuando el checkBox "Imprimir" tenga el valor "1".
Para ello, dentro del "foreach", meto el siguiente código:
data-bind="value: imprimirEnNegrita, checked: imprimirEnNegrita == '1', enable: imprimir == 1" type="checkbox"
Cuando cargo el array mediante Ajax, si imprimir vale "1" el segundo checkbos se habilita. En caso contrario no.
El problema viene cuando, una vez cargado el array hago click sobre el primer checkbox. En depuración veo que la variable ha canviado, pero el segundo checkbos no responde como debiera. Es decir, no se habilita si activo la casilla "Imprimir".
Parece ser que el observableArray monitoriza si añado/elimino items del array, pero no si se modifican sus valores.
Es decir, un observableArray no es un array de observables.
¿Saben si hay manera de que los campos del observableArray pasen a ser observables?