2012-01-10 3 views
1

knockoutjs 파일을 만드는 :knockoutjs - 퀴즈

$(function() { 
    $('#info').hide(); 
    QuizViewModel(); 
    ko.applyBindings(new QuizViewModel()); 

    $('#restart').click(function() { 
     location.reload(); 
    }); 
    }); 


    function QuizViewModel() { 
     var self = this; 

     self.previous = ko.observableArray([]); 
     self.questions = ko.observableArray([]); 
     self.current = ko.observable(); 
     self.number = ko.observable(0); 
     self.previousNumbers = ko.observableArray([]); 
     self.selectedAnswers = ko.observableArray(); 
     self.correctAnswers = ko.observableArray([]); 

     self.loadQuestions = function() { 
      $('#questionsAndAnswers').fadeOut('fast'); 
      $.getJSON('./json/quiz.json', function (data) { 
       $.each(data, function (i, q) { 
        self.questions.push(q); 
        if (q.answers.tf == "true") { 
         self.correctAnswers.push(q.answers.question); 
        } 
        else { 
        // 
        } 

       }); 
      }); 
      $('#questions').fadeIn('fast'); 

     } 
     self.getQuestion = function (number) { 
      $.getJSON('./json/quiz.json', function (data) { 
       $.each(data, function (i, q) { 
        if (number == i) { 
         self.current(q); 
        } 
       }); 
      }); 
     } 

     self.nextQuestion = function (selectedAnswer) { 
      if (self.previousNumbers().length == 15) { 
       $('#questionsAndAnswers').fadeIn('fast'); 
       $('#questions').fadeOut('fast'); 
      } else { 

       var random = Math.floor(Math.random() * 15) 

       if (self.previousNumbers.indexOf(random) == -1) { 
        if (self.previousNumbers().length > 0) { 
         self.current().selectedAnswers = self.selectedAnswers(); 
         //alert(self.current().selectedAnswers[0] + " " + self.current().selectedAnswers[1]); 
         if ($.inArray(self.current().selectedAnswers[0], this.correctAnswers) > -1) { 
          $('#infoCorrect').show(); 
         } 
         self.previous.push(self.current()); 
         self.selectedAnswers.removeAll(); 
        } 
        self.previousNumbers.push(random); 
        self.getQuestion(random); 
        var previousNumber = self.number(); 
        self.number(previousNumber + 1); 

       } else { 
        self.nextQuestion(); 
       } 


      } 

     } 

     $('#questionsAndAnswers').fadeOut('fast'); 

     self.nextQuestion(); 

    } 
내 JSON 파일의

첫 번째 부분 : TF = true 또는 false (단지 이름을 지정하는)

[ 
    {"id" : 1, 
    "question": "Welke stad is de hoofdstad van Brazili\u00eb?", 
    "answers" : [{"answer":"Rio de Janeiro", "tf":"false"}, 
      {"answer":"Brasilia", "tf":"true"}, 
      {"answer":"Sa\u00F5 Paulo", "tf":"false"}], 
    "info" : "De hoofdstad van Brazili\u00eb is Brasilia en niet Rio de Janeiro of Sa\u00F5  Paulo zoals de meesten denken. Tot 1960 was Rio de Janeiro inderdaad de hoofdstad, maar  vanaf dan nam de nieuwe stad Brasilia deze functie over. Niettemin zijn Rio de Janeiro en  Sa\u00F5 Paulo zeer belangrijke steden voor het land met respectievelijk 11 en 6 miljoen  inwoners." 
    }, ... 

HTML5 페이지 :

<div id ="questions" data-bind="with: current"> 

     <h1 id="title">Quiz rond het thema: Brazili&euml; - Sisal</h1> 
        <p class="question" data-bind="text: question"></p> 
        <div class="answers" data-bind="foreach: answers"> 
         <p data-bind="with: $data"> 
          <input id="checkboxes"type="checkbox" data-bind="checked: $root.selectedAnswers, value: answer"/> 
          <span class="answer" data-bind="text: answer"></span> 
         </p> 
        </div> 
        <p id="info" class = "answers" data-bind="text: info"></p> 
        <img id="img1" class="buttons" src="img/next.png" title="Volgende vraag" data-bind="click: $root.nextQuestion"/> 
       </div> 
</section> 
       <div id ="questionsAndAnswers"> 
        <div> 
         <div data-bind="foreach: previous"> 
          <p class="question" data-bind="text: question"></p> 
          <div data-bind="foreach: selectedAnswers"> 
           <span data-bind="text: $data"></span> 
          </div> 
          <div data-bind="foreach: answers"> 
           <p data-bind="with: $data"> 
            <input type="checkbox" data-bind="value: answer, checked: tf=='true'" disabled="true"/> 
            <span class="answer" data-bind="text: answer"> </span><span data-bind="checked: $parent.selectedAnswers"></span> 
    </p> 
    </div> 
    <div> 

          </div> 
         </div> 
        </div> 
        <img id="restart" class="buttons" src="img/start.png" title="Herstart de quiz" /> 
       </div> 

json 파일에서 정답으로 선택한 대답을 확인하는 방법을 누군가에게 알려 줄 수 있습니까? id = "info"로 p 태그를 표시 할 수 있습니까?

나는 내 요구에 대한 코드를 단순화

+0

질문을 올리실 수 있습니까? 이 질문에 훨씬 쉽게 대답 할 수 있습니다. –

답변

2

이 (correctAnswers)을 확인하기 위해 이제 배열을 사용하고 있습니다. 다음은 작업 예에게 있습니다 http://jsfiddle.net/gurkavcu/wJhqB/

요약 : 나는 결과를 표시하고 아약스 이벤트를 시뮬레이션하기위한 녹아웃 매핑 플러그인을 사용

// In every getQuestion function empty correctAnswers array 
self.correctAnswers.remove(function(item){return true;}); 
// Create correct answer array for current question 
$.each(q.answers , function(j,a) {      
     if (a.tf == "true") { 
       self.correctAnswers.push(a.answer);     
      } 
      else {     
      } 
}); 

:

<p id="info" class = "answers" data-bind="text:ko.mapping.toJS($root.correctAnswers)"></p> 

매핑 플러그인 문서 : http://knockoutjs.com/documentation/plugins-mapping.html
매핑 플러그인 출처 : https://raw.github.com/SteveSanderson/knockout.mapping/master/build/output/knockout.mapping-latest.js