我是编程新手(尤其是JS,甚至是KO),我正在努力想出一个注定要由高中生在课堂上使用的互动测验。感谢this article(提供了我用作基础的方法和代码,尝试重新满足我的需求)以及一些好人的帮助,我现在想出了一些看起来像这样:
一切都很好,因为这是有用的。但是......:p我现在想添加一个observableArray,每当用户点击一个时,我会推送()所有selectedAnswer,这样我最终可以将selectedAnswers()。length与questions()进行比较。并且,如果它们是相同的,我可以看到(不包括在代码中)。
我在QuizViewModel构造函数中声明了我的数组(因为它涉及整个测验,所以我认为它应该去的地方):
var selectedAnswers = ko.observableArray();
然后我需要每次都将selectedAnswer属性从Question构造函数推送到它。而这就是摩擦......这是我脚本的一部分:
//Construction
$.each(quizName.controls, function(index, question) {
quiz.questions.push(new Question(index + 1, question));
quiz.selectedAnswers().push(question.selectedAnswer);
});
这会填充一个名为selectedAnswers()的数组,但它只填充了Undefineds,1)即使单击一个答案(undefined未被clicked selectedAnswer ...替换)和selectedAnswers()也不会改变。已经等于问题总数,这意味着我想做的比较不起作用......
必须有一些基本的KO逻辑我没有到达这里(或者它是JS逻辑,这似乎是在逃避我!)对此事的任何想法都将不胜感激!
答案 0 :(得分:0)
将“计算”用于“选定答案”列表。
function Question(config) {
this.text = text;
this.questionText = config.questionText;
this.answers = config.answers;
this.selectedAnswer = ko.observable();
}
function QuizViewModel(quizName) {
this.questions = ko.observableArray(
ko.utils.arrayMap(quizName.controls, function (control) {
return new Question(control);
})
);
this.selectedAnswers = ko.computed(function () {
return ko.utils.arrayMap(this.questions(), function (q) {
return q.selectedAnswer();
}
});
}
当答案已经是问题本身的属性时,无需维护单独的堆栈(即可观察数组)的答案。