2012-04-10 1 views
6

В моей модели с нокаутом у меня есть некоторые свойства, где я пытаюсь сделать хэш наблюдаемым. Так что вместо моего предварительного Knockout кодаКак вы смотрите JavaScript hashtables в Knockout?

self.MyHash = {}; 

Я теперь с помощью:

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

В других частях моего кода, я манипулируя хэш с суждениями типа:

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

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

Код работает, поскольку записи добавляются и удаляются должным образом. Тем не менее, изменения в хэш-таблице, похоже, не обнаруживаются по областям кода, которые его наблюдают. Например, это вычислен наблюдаемым никогда не работает, когда я меняю Хеш:

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

Я собираюсь предположить, что это происходит потому, что Нокаут наблюдаемыми должны быть простыми переменными (или observableArrays), и что это не обнаруживающие основные изменения в моей хэш-таблице.

Если да, есть ли другие варианты? Почему в нокауте нет наблюдаемого типа Hash?

Для чего это необходимо, моим обходным решением является наличие наблюдаемого массива ключей и обычного хэш-таблицы JavaScript для поиска значений. Затем я изменил свой вычислительный метод, чтобы наблюдать массив ключей, а не другую переменную хэш-таблицы, которую я имел раньше. Я просто хочу убедиться, что я не пропущу «Правильный путь», чтобы сделать это в 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("&") : ""; 
}); 

ответ

7

Просмотреть второй пример на observable array page. Просто сделайте массив пар ключ/значение:

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

В ваших примерах вы только итерация (за исключением удаления), так что нет никакой реальной необходимости использовать фактический словарь. Было бы достаточно просто найти ключ. Я думаю, что использование карты в некоторой степени является преждевременной оптимизацией. Его также не полностью соответствует способности строк запросов поддерживать один и тот же ключ несколько раз.

Edit: если вы хотите наблюдать ключ или значение меняющийся в этом примере, вы также должны сделать эти свойства наблюдаемым:

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

Есть ли способ, чтобы наблюдать Hashtable? Я хочу иметь возможность делать ключевые поиски – mcintyre321

Смежные вопросы