恕我直言,我不知道你想從你的代碼做什麼。但是,根據您的評論:
我創建了這種情況,因爲我有一個複選框的列表,如果選擇了其中的2個,則應該不選擇其他。
和你的小提琴,我創造了這個:
(Fiddle)
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());
這隻會告訴你,你是否有太多的選擇與否。 通知驗證約束的用戶可能是比他們已經檢查了自動取消選中框的用戶體驗更好的模式。但是,如果要強制只在一次檢查,我會使用一個變化處理,並跟蹤最近的變化,將它添加到您的視圖模型:
(Fiddle)
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:任何類似的想法,比如「檢查框是否過多」都可以表示爲一組相互關聯的數據:複選框數組,是否選中每個複選框,以及描述框當前狀態有效性的屬性。
這看起來有點遞歸給我。對屬性進行訂閱,然後設置屬性。 –
我創建了這個場景,因爲我有一個複選框的列表,如果選擇了其中的2個,則不應該選擇其他的。 – Xepe
請在您的問題中添加更多詳情。你如何定義複選框以取消選擇?添加您的完整視圖模型。 – alexmac