2012-04-10 19 views
6

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("&") : ""; 
}); 

Respuesta

7

Vea el segundo ejemplo en el observable array page. Acaba de hacer una serie de pares clave/valor:

// This observable array initially contains three objects 
var anotherObservableArray = ko.observableArray([ 
    { name: "Bungle", type: "Bear" }, 
    { name: "George", type: "Hippo" }, 
    { name: "Zippy", type: "Unknown" } 
]); 

En los ejemplos sólo se iterando (excepto para su eliminación), así que no hay necesidad real de usar un diccionario real. Sería bastante fácil simplemente buscar la clave. Creo que el uso del mapa es una especie de optimización prematura en cierta medida. Tampoco está completamente en línea con la capacidad de las cadenas de consulta para admitir la misma clave varias veces.

Editar: si desea observar la clave o el valor cambia en este ejemplo, también habría que tomar esas propiedades observables:

var anotherObservableArray = ko.observableArray([ 
    { name: ko.observable("Bungle"), type: ko.observable("Bear") } 
]); 
+3

¿Hay una manera de observar una tabla hash? Quiero poder hacer búsquedas clave – mcintyre321

Cuestiones relacionadas