2012-04-10 11 views
6

Nel mio viewmodel Knockout, ho alcune proprietà in cui sto cercando di rendere un hash osservabile. Così, invece del mio codice pre-Knockout diCome si osservano gli hash JavaScript in Knockout?

self.MyHash = {}; 

ora sto usando:

self.MyHash = ko.observable({}); 

In altre parti del mio codice, sto manipolando l'hash con affermazioni come queste:

// add an entry 
self.MyHash()["test"] = "My Value"; 

// remove an entry 
delete self.MyHash()["test"]; 

Il codice funziona, in quanto le voci vengono aggiunte e rimosse correttamente. Tuttavia, le modifiche alla tabella hash non sembrano essere rilevate dalle aree del codice che la stanno osservando. Ad esempio, questa calcolato osservabile non finisce mai quando sto cambiando la tabella 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("&") : ""; 
}); 

sto andando a indovinare che questo è perché osservabili Knockout sono tenuti ad essere variabili semplici (o observableArrays), e che non è rilevare il modifiche sottostanti al mio hashtable.

Se sì, ci sono altre opzioni? Perché non c'è un tipo Hash osservabile in Knockout?

Per quello che vale, la mia soluzione è di avere un array osservabile di chiavi e un normale hash JavaScript per cercare i valori. Poi ho cambiato il mio metodo calcolato per osservare la serie di chiavi piuttosto che l'altra variabile hashtable che avevo prima. Voglio solo assicurarmi che non manchi "The Right Way" per farlo in 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("&") : ""; 
}); 

risposta

7

Vedere il secondo esempio su observable array page. Basta fare una serie di coppie chiave/valore:

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

Nei tuoi esempi si sta solo iterazione (tranne che per l'eliminazione), quindi non c'è alcuna reale necessità di utilizzare un dizionario vero e proprio. Sarebbe stato abbastanza facile cercare la chiave. Penso che l'uso della mappa sia in qualche modo una prematura ottimizzazione. Inoltre, non è del tutto in linea con la capacità delle stringhe di query di supportare la stessa chiave più volte.

Edit: se si desidera osservare la chiave o il valore cambia in questo esempio, si avrebbe anche per fare quelle proprietà osservabili:

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

C'è un modo per osservare una tabella hash? Voglio essere in grado di fare ricerche chiave – mcintyre321

Problemi correlati