恕我直言,我不知道您要从代码中做什么。但是,根据您的评论:
我创建了这个场景,因为我有一个复选框列表,如果选择了其中 2 个,则不应选择另一个。
和你的小提琴,我创造了这个:
(小提琴)
function CheckboxedTextbox(checkboxValue, textboxValue) {
this.textboxValue = ko.observable(textboxValue);
this.checkboxValue = ko.computed(function() {
return this.textboxValue();
}, this);
this.isSelected = ko.observable(checkboxValue);
}
function ViewModel() {
this.checkboxes = ko.observableArray([
new CheckboxedTextbox(false),
new CheckboxedTextbox(true, "Default value?"),
new CheckboxedTextbox(false)
]);
this.valid = ko.computed(function() {
return this.checkboxes().filter(function(c) {
return c.isSelected();
}).length <= 2;
}, this);
}
ko.applyBindings(new ViewModel());
它只会告诉您是否选择了太多。通知您的用户验证约束可能是比自动取消选中他们已选中的框更好的用户体验模式。但是,如果您只想强制一次检查,我会使用更改处理程序并跟踪最近的更改,将其添加到您的视图模型中:
(小提琴)
this.lastChangedBox = ko.observable();
this.forceQuantityChecked = function(newlyChecked) {
setTimeout(function() {
if (!this.valid()) {
this.checkboxes().filter(function(c) {
return c.isSelected() && c !== this.lastChangedBox() && c !== newlyChecked;
}.bind(this)).forEach(function(c) {
c.isSelected(false);
});
}
this.lastChangedBox(newlyChecked);
}.bind(this), 0);
};
我们确实看到了对setTimeout
.
最重要的是数据是好的,这就是我们使用observable
s 和computed
s 的原因:任何诸如“检查的复选框是否太多”之类的想法都可以表示为一组相互关联的数据:一个复选框数组,是否每个复选框都被选中,以及一个描述框当前状态有效性的属性。