knockout.js 中的复选框逻辑
Checkbox Logic in knockout.js
我有两个复选框,我想实现以下逻辑:
如果两者都关闭,则允许,如果一个复选框打开,如果另一个要打开(选中),则第一个必须切换到关闭,反之亦然
如何使用 html 和 ko.js 执行此操作?
这是我得到的用于切换的代码:
var viewmodel = function(){
var self = this;
self.checkA = ko.observable(true);
self.checkB = ko.pureComputed({
read: function(){
return !self.checkA()
},
write: function(value){
value? self.checkA(false) : self.checkA(true);
},
owner: self
});
};
ko.applyBindings(新视图模型());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
A
<input type="checkbox" data-bind="checked: checkA" />
B
<input type="checkbox" data-bind="checked: checkB" />
由于 B 的值不仅仅是 A 值的函数(两者都可能为假),因此您必须有第二个可观察对象来独立存储其状态。然后,对于您的逻辑,我建议使用 ko.subscribe 而不是计算函数来对任一值的更改做出反应。
var viewmodel = function() {
var self = this;
self.checkA = ko.observable(true);
self.checkB = ko.observable(false);
self.checkA.subscribe(function(value) {
if (value) self.checkB(false); //also clear B
});
self.checkB.subscribe(function(value) {
if (value) self.checkA(false); //also clear A
});
};
ko.applyBindings(new viewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
A <input type="checkbox" data-bind="checked: checkA" />
B <input type="checkbox" data-bind="checked: checkB" />
我有两个复选框,我想实现以下逻辑:
如果两者都关闭,则允许,如果一个复选框打开,如果另一个要打开(选中),则第一个必须切换到关闭,反之亦然
如何使用 html 和 ko.js 执行此操作?
这是我得到的用于切换的代码:
var viewmodel = function(){
var self = this;
self.checkA = ko.observable(true);
self.checkB = ko.pureComputed({
read: function(){
return !self.checkA()
},
write: function(value){
value? self.checkA(false) : self.checkA(true);
},
owner: self
});
};
ko.applyBindings(新视图模型());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
A
<input type="checkbox" data-bind="checked: checkA" />
B
<input type="checkbox" data-bind="checked: checkB" />
由于 B 的值不仅仅是 A 值的函数(两者都可能为假),因此您必须有第二个可观察对象来独立存储其状态。然后,对于您的逻辑,我建议使用 ko.subscribe 而不是计算函数来对任一值的更改做出反应。
var viewmodel = function() {
var self = this;
self.checkA = ko.observable(true);
self.checkB = ko.observable(false);
self.checkA.subscribe(function(value) {
if (value) self.checkB(false); //also clear B
});
self.checkB.subscribe(function(value) {
if (value) self.checkA(false); //also clear A
});
};
ko.applyBindings(new viewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
A <input type="checkbox" data-bind="checked: checkA" />
B <input type="checkbox" data-bind="checked: checkB" />