Javascript 为什么observableArray在淘汰赛JS中不可见?

Javascript 为什么observableArray在淘汰赛JS中不可见?,javascript,knockout.js,ko.observablearray,Javascript,Knockout.js,Ko.observablearray,我是编程新手(特别是在JS中,甚至在KO中更是如此),我正在尝试设计一个互动测验,供高中生在课堂上使用。感谢(它提供了操作指南和代码,我将其用作基础,试图根据我的需要重新调整)和一些好的人的帮助,我现在想出了如下的东西: 一切都很好,因为这是功能性的。但是p我现在想添加一个ObservatedArray,每次用户单击一个答案时,我都会推送()所有选择的答案,这样我就可以在最后比较选择的答案().length和问题().length,如果它们相同,我会让一个(尚未包含在代码中)可见 我在Quiz

我是编程新手(特别是在JS中,甚至在KO中更是如此),我正在尝试设计一个互动测验,供高中生在课堂上使用。感谢(它提供了操作指南和代码,我将其用作基础,试图根据我的需要重新调整)和一些好的人的帮助,我现在想出了如下的东西:

一切都很好,因为这是功能性的。但是p我现在想添加一个ObservatedArray,每次用户单击一个答案时,我都会推送()所有选择的答案,这样我就可以在最后比较选择的答案().length和问题().length,如果它们相同,我会让一个(尚未包含在代码中)可见

我在QuizViewModel构造函数中声明了我的数组,如下所示(因为它涉及到整个测验,所以我认为这就是它应该去的地方):

然后,每次我都需要将selectedAnswer属性从问题构造函数推送到其中。这就是问题所在。。。以下是我脚本的一部分:

//Construction
$.each(quizName.controls, function(index, question) {
    quiz.questions.push(new Question(index + 1, question));
    quiz.selectedAnswers().push(question.selectedAnswer);
});
这会填充一个名为selectedAnswers()的数组,但它只填充了未定义项,1)即使单击答案(未定义项不会替换为单击的selectedAnswer…)和selectedAnswers(),也不会发生变化。长度已经等于问题总数,这意味着我想做的比较不起作用

一定有一些基本的KO逻辑我在这里没有得到(或者它是JS逻辑,这显然似乎是逃避我!)任何想法对这件事将不胜感激

为“选定答案”列表使用计算出的答案


当答案已经是问题本身的属性时,不需要维护一个单独的答案堆栈(即可观察数组)。

你的小提琴出了什么问题?@AshReva一切正常,但如果你看一下控制台,你会发现selectedAnswers()有6个未定义的答案,而不是在我单击时更新。。。我需要它在开始时是空的,并且在我单击时添加问题,所以我在最后只有六个…这是因为在加载页面时,每个页面都有$。但是我确实需要$。每个页面都有其他内容。。。那么我应该把我的代码放在哪里来推送我可观察数组中每个问题的selectedAnswer呢?你能不能把代码放在一些按钮点击上,这样它只在需要时才被加载?我们不能只取消对代码测验的注释。selectedAnswers().push(question.selectedAnswer);当页面加载时。为什么他需要在页面加载时推送selectedAnswers?我不理解这个评论。我的意思是为什么我们需要这个代码测试。selectedAnswers().push(question.selectedAnswer);在函数QuizModelBe中,你应该问OP,而不是我?我的答案没有这行代码。嘿@Tomalak,你能解释一下ko.utils.arrayMap()是什么吗?我以前从未遇到过这种情况,甚至在文档中也没有遇到过(但我承认,我还没有读过全部内容!)
//Construction
$.each(quizName.controls, function(index, question) {
    quiz.questions.push(new Question(index + 1, question));
    quiz.selectedAnswers().push(question.selectedAnswer);
});
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();
        }
    });
}