foreach
ループでラジオボタンを生成しています。チェックされたプロパティを親の基本的なオブザーバブルにバインドしようとしています。残念ながら、ラジオボタンをクリックすると、クリックハンドラーで親のプロパティが更新されないようです。
以前のいくつかの作業に基づくと、クリックハンドラーは、ビューモデルの更新された値を取得するための許容可能な場所である必要があるようです。最も不思議なことに、ラジオボタンを数回クリックすると、正しい値が出始めたようです。
コード:
function Question() {
this.name = "My Question";
this.answers = ko.observableArray([
new Answer(1, "Answer 1", false),
new Answer(2, "Answer 2", true),
new Answer(3, "Answer 3", false)]);
this.correctAnswer = ko.observable(2);
}
function Answer(id, name, isRight) {
this.id = ko.observable(id);
this.name = ko.observable(name);
this.isRight = ko.observable(isRight);
}
ko.applyBindings(new Question());
$(document).on("click", "input[type='radio']", function () {
var answer = ko.dataFor(this);
var question = ko.contextFor(this).$parent;
var answerId = answer.id();
var correctAnswer = question.correctAnswer();
alert(answerId + " should equal " + correctAnswer +
(answerId === correctAnswer ? " SWEET" : " DAMNIT"));
});
HTML
<div data-bind="text:name"></div>
<div data-bind="foreach:answers">
<label>
<span data-bind="text: name"></span>
<input type="radio" name="X" data-bind="value: id, checked:$parent.correctAnswer" />
</label>
<br />
</div>