如何在Knockout中观察JavaScript哈希表?

6
在我的Knockout视图模型中,我有一些属性,我正在尝试使一个哈希可观察。因此,而不是我的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("&") : "";
});

我猜想这是因为 Knockout observables 要求是简单的变量(或 observableArrays),它没有检测到我的哈希表的基本更改。
如果是这样,是否有其他选择?为什么 Knockout 中没有 observableHash 类型?
值得一提的是,我的解决方法是使用可观察的键数组和一个常规的 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("&") : "";
});
1个回答

7
请查看可观察数组页面上的第二个示例。只需创建一个键/值对的数组:
// 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") }
]);

3
有没有一种方法可以观察哈希表?我想要能够进行键查找。 - mcintyre321

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接