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