为什么在Knockout JS中observableArray不可观察?

时间:2014-01-25 12:36:04

标签: javascript knockout.js ko.observablearray

我是编程新手(尤其是JS,甚至是KO),我正在努力想出一个注定要由高中生在课堂上使用的互动测验。感谢this article(提供了我用作基础的方法和代码,尝试重新满足我的需求)以及一些好人的帮助,我现在想出了一些看起来像这样:

http://jsfiddle.net/sNJm3/2/

一切都很好,因为这是有用的。但是......: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逻辑,这似乎是在逃避我!)对此事的任何想法都将不胜感激!

1 个答案:

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

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