6

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 observableが単純な変数(またはobservableArrays)である必要があり、ハッシュテーブルの根本的な変更を検出していないためだと推測します。

もしそうなら、他のオプションはありますか?KnockoutにobservableHashタイプがないのはなぜですか?

私の回避策は、observableArrayのキーと、値を検索するための通常の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("&") : "";
});
4

1 に答える 1

7

監視可能な配列ページの2番目の例を参照してください。キーと値のペアの配列を作成するだけです。

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

あなたの例では、(削除を除いて)反復しているだけなので、実際の辞書を使用する必要はありません。キーを検索するだけで十分簡単です。マップの使用は、ある程度時期尚早な最適化のようなものだと思います。また、同じキーを複数回サポートするクエリ文字列の機能と完全に一致しているわけではありません。

編集:この例で変化するキーまたは値を監視する場合は、それらのプロパティも監視可能にする必要があります。

var anotherObservableArray = ko.observableArray([
    { name: ko.observable("Bungle"), type: ko.observable("Bear") }
]);
于 2012-04-10T00:57:42.230 に答える