我想要实现的目标如下。在20个点的列表中,用户可以选择3次5次,4次4次,5次3次等。
如何通过淘汰赛实现这一目标?
我目前有一个名字的列表,以及一个名为rating的observablevar。 谁能帮助我呢?
示例摘录
<!-- ko foreach: {data: rateableList } -->
<tr>
<td data-bind="text: name"></td>
<td align="center"><input type="radio" value="nvt" data-bind="checked: rating"></td>
<td align="center"><input type="radio" value="1" data-bind="checked: rating"></td>
<td align="center"><input type="radio" value="2" data-bind="checked: rating"></td>
<td align="center"><input type="radio" value="3" data-bind="checked: rating"></td>
<td align="center"><input type="radio" value="4" data-bind="checked: rating"></td>
<td align="center"><input type="radio" value="5" data-bind="checked: rating"></td>
</tr>
<!-- /ko -->
答案 0 :(得分:1)
您可以使用可写的计算observable进行验证,只有在验证通过时才写入后备字段。在您的情况下,您将检查所有评级,看看计数是否正常。我做了一个简化的示例小提琴,它只检查用户在选择其他值后是否选择“nvt”。
小提琴:http://jsfiddle.net/pe8hg0v6/2/
使用Javascript:
var viewModel;
document.addEventListener("DOMContentLoaded", function(event) {
var list = [];
viewModel = {};
viewModel.isValid = function(value){
//TODO; your actual validation logic
return value !== "nvt";
};
for(var i=0; i < 5; i++){
var createObj = function(){
var obj = {};
obj.name = "test";
obj.rating = ko.observable("nvt");
obj.validatedRating = ko.computed({
read: function(){return obj.rating()},
write: function(value){if(viewModel.isValid(value)) obj.rating(value);}
});
return obj;
};
list.push(createObj());
}
viewModel.rateableList = list;
ko.applyBindings(viewModel);
});