Knockoutjs会缩放最大点数

时间:2015-09-01 15:38:32

标签: knockout.js

我想要实现的目标如下。在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 -->

1 个答案:

答案 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);
});