结合KnockoutJS以单选按钮与计算(Binding KnockoutJS to Radio B

2019-09-16 16:36发布

我有答案的数组的问题。 每个回答都有一个布尔属性称为isRight,它代表了答案是否正确......。

我试图使每个答案一个单选按钮,如果这个答案是正确的有它进行检查。 如果用户点击不同的按钮,这个问题的答案变得正确。

据我所知,KO结合checked属性的值,如果电台的值相匹配的限值每个单选按钮只会检查; 你不能只是直接绑定到isRight。

我把computedObservable于问题本身,它应该做的一切。 和它的作品。 问题是,我想订阅的单选按钮的变化情况下,当选择一个新的答案,看看(和发送Ajax请求)。 我遇到的问题是,劫结合在变更处理程序未更新。 它似乎把一个延迟的处理会给我我想要的,但我更喜欢一个更直接的解决方案。

它似乎click事件的作品完美,但会每一个单选按钮被点击时触发,即使它已被选中。

有没有什么办法,以确保绑定在更改事件更新? 当前的代码KO 2.0,我也试着2.1。

全小提琴


全来源:

function Question() {
    this.name = "My Question";

    var i = 0;
    this.answers = ko.observableArray([
        new Answer(++i, "Answer 1", false),
        new Answer(++i, "Answer 2", true),
        new Answer(++i, "Answer 3", false)]);

    this.correctAnswer = ko.computed({
        read: function () {
            for (var i = 0, max = this.answers().length; i < max; i++)
                if (this.answers()[i].isRight())
                    return "answer-" + this.answers()[i].id();
        },
        write: function (newValue) {
            var newId = +newValue.split('-')[1];
            for (var i = 0, max = this.answers().length; i < max; i++)
                this.answers()[i].isRight(this.answers()[i].id() === newId);
        },
        owner: this
    });
}


function Answer(id, name, isRight) {
    this.id = ko.observable(id);
    this.name = ko.observable(name);
    this.isRight = ko.observable(isRight);
}

$(function () {
    ko.applyBindings(new Question());

    $(document).on("change", "input[type='radio']", function () {
        var answer = ko.dataFor(this);
        var isRight = answer.isRight();

        setTimeout(function () { alert("before = " + isRight + "  after = " + answer.isRight()); }, 1000);
    });
});

HTML:

<div data-bind="text:name"></div>
<div data-bind="foreach:answers">
    <label>
        <span data-bind="text: name"></span>
        <input type="radio" name="uniqueQuestionName" data-bind="value: 'answer-' + id(), checked:$parent.correctAnswer" />
    </label>
    <br />
</div>

Answer 1:

除非你有特殊原因订阅“改变”事件,你可能要考虑使用手动订阅到可观察到的这种情况正在改变。 您可以随时将实际的数据改变时通知这种方式。

下面是一个使用一个稍微不同的方法的例子: http://jsfiddle.net/rniemeyer/FvZXj/ 。 它使用一个函数来处理设定的值,它通过当前答案作为第一个参数。 然后,它使用的是正确设置isRight和可观察到的correctAnswer ,你可以订阅反对。



文章来源: Binding KnockoutJS to Radio Button with computed