【发布时间】:2016-06-12 22:27:36
【问题描述】:
我有一个计算出的淘汰赛,其工作方式类似于选中/取消选中除“是”和“否”单选按钮之外的所有字符串。
我想尝试扩展它,以便它可以针对不同的可观察属性工作。目前,如果“optionList”中的所有“paramOne”属性都被选为“yes”,那么我返回“yes”,类似于“no”。但我也想将它用于“paramTwo”参数和“paramThree”参数等。
任何想法如何做到这一点?也许计算在这里不是最合适的?
在这里提琴:https://jsfiddle.net/3kpx5qaf/
var AppViewModel = function() {
var self = this;
self.optionList = ko.observableArray();
self.optionList().push({
id : 'option1',
title: "option one",
paramOne:ko.observable(),
paramTwo: ko.observable(),
paramThree: ko.observable(),
paramFour: ko.observable()
});
self.optionList().push({
id : 'option2',
title: "option two",
paramOne:ko.observable(),
paramTwo: ko.observable(),
paramThree: ko.observable(),
paramFour: ko.observable()
});
self.selectAll = ko.computed({
read: function() {
var numNo = 0;
var numYes = 0;
var items = self.optionList();
ko.utils.arrayFirst(items, function(item) {
if(item.paramOne() == "No"){
numNo += 1;
}else if(item.paramOne() == "Yes"){
numYes += 1;
}
});
if(numNo == items.length){
return "No";
}else if(numYes == items.length){
return "Yes";
}else{
return null;
}
},
write: function(value) {
var items = self.optionList();
ko.utils.arrayForEach(items, function(item) {
item.paramOne(value);
});
}
});
}
ko.applyBindings(new AppViewModel());
【问题讨论】:
-
使用
"yes"和"no"而不是true和false有什么意义?使用两个字符串来表示布尔值很麻烦、容易出错、存在国际化问题以及所有这些,同时没有提供任何功能优势。那为什么要这么做呢? -
同意,布尔值更适合这里,但淘汰文档中的示例基于单选按钮值 (knockoutjs.com/documentation/checked-binding.html),所以这是我做的第一件事。
-
我同意 Jeroen 关于 XY 问题的观点。与其描述您想要实施的解决方案,不如描述您想要解决的问题。
标签: knockout.js