我有一个复选框,它以前直接绑定到我的视图模型上的可观察属性。我在所有视图模型上使用了一个通用的脏标志,它监视视图模型上所有可观察属性的变化。
现在对于一个属性,如果用户在取消设置底层可观察对象之前尝试取消选中复选框,我希望显示确认警报。我试图将其实现为一个可写的计算 observable,它像这样包装 observable:
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 时,“selected”写入函数仅在我每次选中复选框时触发,而不是在我取消选中它时触发。如果我将 SelectedInternal 可观察值默认为 true,那么我第一次取消选中它时 write setter 会执行,但不会在后续取消选中时执行。
这是一个要演示的小提琴:
这里发生了什么?有没有更好的方法来实现这一目标?
更新:这种方法可能无论如何都行不通,因为我无法钩入原始点击以返回 false,并且如果用户在确认框中选择取消,则将 observable 重置为 true 似乎没有采取影响。但我仍然想知道为什么计算的 setter 本身没有按预期运行。