以前はビュー モデルの監視可能なプロパティに直接バインドされていたチェックボックスがあります。すべてのビュー モデルで汎用のダーティ フラグを使用して、ビュー モデルのすべての監視可能なプロパティの変更を監視します。
ここで、あるプロパティについて、基になるオブザーバブルの設定を解除する前にユーザーがチェックボックスをオフにしようとした場合に確認アラートを表示したいと考えています。私はこれを次のようにオブザーバブルをラップする書き込み可能な計算オブザーバブルとして実装しようとしました:
function VM() {
var self = this;
self.SelectedInternal = ko.observable(false);
self.selected= ko.computed({
read: function () {
return self.SelectedInternal();
},
write: function (value) {
alert('Clicked'); // To demonstrate problem
if (value === false) {
if (confirm('Are you sure you wish to deselect this option?')) {
self.SelectedInternal(value);
}
}
}
});
}
var vm = new VM();
ko.applyBindings(vm);
(Firefox と IE の両方で) 私が見ているのは、上記のように SelectedInternal オブザーバブル値を false にデフォルト設定すると、「選択された」書き込み関数は、チェックボックスをオフにしたときではなく、チェックボックスをオンにするたびにのみ起動することです。SelectedInternal オブザーバブル値を true にデフォルト設定すると、最初にチェックを外したときに書き込みセッターが実行されますが、その後のチェック解除では実行されません。
デモ用のフィドルを次に示します。
ここで何が起きてるの?これを達成するためのより良い方法はありますか?
更新:元のクリックにフックを付けて false を返すことができないため、このアプローチはおそらくうまくいかないでしょう。ユーザーが確認ボックスでキャンセルを選択した場合、オブザーバブルを true にリセットしても効果。しかし、計算されたセッター自体が期待どおりに動作しない理由を知りたいです。