如何观察敲除中的JavaScript哈希表?

如何观察敲除中的JavaScript哈希表?,javascript,knockout.js,Javascript,Knockout.js,在我的Knockout viewmodel中,我有一些属性,我试图让散列成为可观察的。所以不是我的预淘汰代码 self.MyHash = {}; 我现在使用: self.MyHash = ko.observable({}); 在代码的其他部分中,我使用如下语句处理哈希: // add an entry self.MyHash()["test"] = "My Value"; // remove an entry delete self.MyHash()["test"]; 代码的工作原理是正

在我的Knockout viewmodel中,我有一些属性,我试图让散列成为可观察的。所以不是我的预淘汰代码

self.MyHash = {};
我现在使用:

self.MyHash = ko.observable({});
在代码的其他部分中,我使用如下语句处理哈希:

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

// remove an entry
delete self.MyHash()["test"];
代码的工作原理是正确地添加和删除条目。但是,哈希表的更改似乎不会被观察它的代码区域检测到。例如,当我更改哈希表时,此计算的observable从不运行:

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("&") : "";
});
我想这是因为敲除的可观测值必须是简单变量(或ObservalArrays),并且它没有检测到哈希表的潜在变化

如果有,还有其他选择吗?为什么淘汰赛中没有明显的灰烬类型

值得一提的是,我的解决方法是使用一个可观察的键数组,以及一个常规的JavaScript哈希表来查找值。然后,我改变了我的计算方法,以观察键数组,而不是之前的另一个哈希表变量。我只是想确保我在淘汰赛中没有错过“正确的方式”

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

请参见上的第二个示例。只需创建一个键/值对数组:

// This observable array initially contains three objects
var anotherObservableArray = ko.observableArray([
    { name: "Bungle", type: "Bear" },
    { name: "George", type: "Hippo" },
    { name: "Zippy", type: "Unknown" }
]);
在您的示例中,您只进行了迭代(删除除外),因此实际上不需要使用实际的字典。只要搜索钥匙就足够容易了。我认为使用map在某种程度上是一种过早的优化。它也不完全符合查询字符串多次支持同一个键的能力

编辑:如果要观察本例中键或值的变化,还必须使这些属性可见:

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

有没有办法观察哈希表?我想能够做关键的查找