javascript - 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(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" />
解决方案
由于 B 的值不仅仅是 A 的值的函数(两者都可能为假),因此您必须有第二个 observable 来独立存储其状态。然后,对于您的逻辑,我建议使用 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" />
推荐阅读
- flutter - 如何在 google admob 上删除测试广告文字
- amazon-s3 - 如何在不使用 Confluent 的情况下使用 Kakfa Connect 从 Kafka 将数据发送到 AWS S3?
- javascript - javascript使用中的正则表达式失败
- html - 修复图像附近名称标签的问题
- r - 由于 R 中的数据类型问题,无法过滤数据帧
- android - Android Xamarin 应用程序 - 如何在设备屏幕关闭然后重新打开时保持表单状态?
- python-3.x - 根据字典列表和特定日期条件替换列值 - 使用 if 和 for 循环 - Pandas
- flutter - 重新安排 Flutter 时,本地通知不会在新时间触发
- javascript - 如何使用云功能从我的 Firebase 实时数据库中的 database.ref 正在侦听的节点内部获取数据?
- javascript - 在命令行上关闭由`open`打开的窗口