En mi modelo de vista Knockout, tengo algunas propiedades en las que intento hacer un hash observable. Así que en lugar de mi pre-Knockout código de¿Cómo se observan las tablas hash JavaScript en Knockout?
self.MyHash = {};
ahora estoy utilizando:
self.MyHash = ko.observable({});
En otras partes de mi código, estoy manipulando el hash con declaraciones como éstas:
// add an entry
self.MyHash()["test"] = "My Value";
// remove an entry
delete self.MyHash()["test"];
El código funciona, ya que las entradas se agregan y eliminan correctamente. Sin embargo, los cambios a la tabla hash no parecen ser detectados por las áreas del código que lo están observando. Por ejemplo, este calcula observables nunca se acaba cuando estoy cambiando la tabla hash:
self.Querystring = ko.computed(function()
{
var f = [];
$.each(self.MyHash(), function (k, v)
{
f.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));
});
return (f.length > 0) ? f.join("&") : "";
});
Voy a suponer que esto se debe a los observables Knockout están obligados a ser variables simples (o observableArrays), y que no es la detección de la cambios subyacentes a mi hashtable.
Si es así, ¿hay otras opciones? ¿Por qué no hay un tipo de Hash observable en Knockout?
Por lo que vale la pena, mi solución es tener una matriz observable de claves, y una tabla hash JavaScript común para buscar los valores. Luego cambié mi método calculado para observar la matriz de claves en lugar de la otra variable hashtable que tenía antes. Solo quiero asegurarme de no perderme "The Right Way" para hacerlo en Knockout.
self.MyHashKeys = ko.observableArray();
self.MyHash = {};
self.Querystring = ko.computed(function()
{
var f = [];
$.each(self.MyHashKeys(), function (index, value)
{
f.push(encodeURIComponent(value) + '=' + encodeURIComponent(self.MyHash[value]));
});
return (f.length > 0) ? f.join("&") : "";
});
¿Hay una manera de observar una tabla hash? Quiero poder hacer búsquedas clave – mcintyre321