2014-01-25 3 views
0

Я новичок в программировании (особенно в JS и даже больше с KO), и я пытаюсь создать интерактивную викторину, предназначенную для использования в классе учениками старших классов. Благодаря this article (который предоставил практическое руководство и код, который я использовал в качестве базы, пытаясь перевести его в соответствии с моими потребностями), и некоторые полезные люди здесь, я теперь придумал что-то похожее на это:Почему наблюдаемый массив не наблюдается в Knockout JS?

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

Все хорошо, потому что это функционально. Но ...: p Теперь я хотел бы добавить наблюдаемый массив, в который я бы нажал() все выбранные ответы каждый раз, когда пользователь нажимает один, чтобы я мог в конце сравнить compareAnswers(). Length to questions(). Length и, если они будут одинаковыми, я бы сделал (пока не включен в код) видимым.

я объявил мой массив в конструктор 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 не заменен щелчком selectedAnswer ...) и selectedAnswers(). Длина уже равна общему числу вопросов, что означает, что сравнение, которое я хотел сделать, не будет работать ...

будь то фундаментальная логика KO, которую я не получаю здесь (или это логика JS, которая определенно, похоже, ускользает от меня!) Любые мысли по этому вопросу были бы очень признательны!

+0

Что не так в вашей скрипке? – DevelopmentIsMyPassion

+0

@AshReva Все правильно, но если вы заглянете на консоль, то увидите, что selectedAnswers() имеет 6 неопределенных вместо обновления, когда я нажимаю ... И мне нужно, чтобы оно было пустым в начале и чтобы добавлять вопросы, когда я нажимаю, поэтому у меня есть шесть ТОЛЬКО НА КОНЕЦ ... – ReinaDelSur

+0

То, потому что у вас есть этот $ .each, когда загружается страница. – DevelopmentIsMyPassion

ответ

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

Там нет необходимости поддерживать отдельный стек (т.е. наблюдаемого массива) ответов, когда ответ уже есть свойство самого вопроса.

+0

can not мы просто раскомментируем код quiz.selectedAnswers(). Push (question.selectedAnswer); когда страница загружается. Зачем ему нужно нажимать selectedAnswers во время загрузки страницы? – DevelopmentIsMyPassion

+0

Я не понимаю этого комментария. – Tomalak

+0

Я имел в виду, почему мы нуждаемся в этом викторине. Выбранный(). Push (question.selectedAnswer); в функции quizmodel – DevelopmentIsMyPassion