計算されたオブザーバブル(後でprotectedObservableに変換します)でCookieをラップしようとしていますが、計算されたオブザーバブルに問題があります。計算されたオブザーバブルへの変更は、それにバインドされているすべてのUI要素にブロードキャストされると私は考えていました。
JavaScript:
var viewModel = {};
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
return {
'write' : function (val) { privateZipcode = val; },
'read': function () { return privateZipcode; }
}
}();
viewModel.zipcode = ko.computed({
read: function () {
return cookie.read();
},
write: function (value) {
cookie.write(value);
},
owner: viewModel
});
ko.applyBindings(viewModel);?
HTML:
zipcode:
<input type='text' data-bind="value: zipcode"> <br />
zipcode:
<span data-bind="text: zipcode"></span>?
オブザーバブルを使用して保存することはありませんprivateZipcode
。これは、実際にはCookieに含まれるためです。私が見た例のほとんどはカバーの下を使用することko.computed
になりますが、が必要な通知とバインディング機能を提供することを望んでいます。ko.computed
ko.observable
計算されたオブザーバブルに値を書き込むという行為は、その値にバインドされているUI要素に信号を送るべきではありませんか?これらはただ更新するべきではありませんか?
回避策
簡単な回避策がありko.observable
ます。Cookieストアと一緒に使用すると、DOM要素に必要な更新がトリガーされますがko.computed
、シグナリング/依存関係タイプの機能がない場合を除いて、これは完全に不要のようko.observable
です。
私の回避策のフィドルですが、変更されるのは、ストアとして使用されていないを追加したseperateObservable
ことだけです。その唯一の目的は、基になるデータが変更されたことをUIに通知することです。
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
// extra observable that isnt really used as a store, just to trigger updates to the UI
var seperateObservable = ko.observable(privateZipcode);
return {
'write' : function (val) {
privateZipcode = val;
seperateObservable(val);
},
'read': function () {
seperateObservable();
return privateZipcode;
}
}
}();
これは理にかなっており、私が期待するとおりに機能します。これは、UIにviewModel.zipcode
依存しseperateObservable
て更新することで、UIに更新を通知する必要があるためです。 私が理解していないのは、その要素がそれにバインドされているので、なぜwrite
私のシグナルの関数を呼び出してko.computed
UIを更新しないのko.computed
ですか?
ノックアウトで何かを使用して、自分ko.computed
が更新されたことを手動で通知する必要があるのではないかと思ったのですが、それで問題ありません。それは理にかなっています。私はそれを達成する方法を見つけることができませんでした。