2015-03-30 87 views
0

我想創建一個測驗應用程序。爲了sumarize答案,並決定哪個答案是正確的,我有這樣的集合中的項:通過陣列中的數組迭代

{ 
"_id" : "Q5D63eQA8AnYHJrRc", 
"userId" : "X67n8vbiraEsEvWYD", 
"username" : "ania", 
"test" : { 
    "T1" : { 
     "Q1" : "A", 
     "Q2" : "D", 
     "Q3" : "D" 
    }, 
    "T2" : { 
     "Q1" : "A", 
     "Q2" : "D", 
     "Q3" : "D" 
    } 
}} 

我也嘗試過使用[以表明它是一個數組。

現在我使用:

<ul class="list-group nav nav-pills nav-stacked"> 
     {{#each Answers}} 
      {{>usernamesList}} 
     {{/each}} 
    </ul> 

</template> 

<template name="usernamesList"> 
    <li><a href="#" class="list-group-item answer">{{username}}</a></li> 
    {{test.T1.Q1}} 
</template> 

我能夠獲得Q1的價值,但我不能使用另一種顯示在循環每一個答案,{{#each}}。 我試着創建一個數組,但我也必須區分哪個答案屬於哪個問題和測試。

編輯:

收集

Answers = new Mongo.Collection("answers"); 

助手:

Template.admin.helpers({ 
    Questions: function() { 
     return Questions.find({}); 
    }, 
    Answers: function() { 
     return Answers.find({}); 
    } 
}); 

我也試圖創造這樣的集合:

{"userId" : "X67n8vbiraEsEvWYD", 
"username" : "ania", 
    "test" : [{ 
     "T1" :[{ 
     "Q1":"A", 
     "Q2":"D", 
     "Q3":"D" 
    }], 
     "T2" : [{ 
     "Q1":"A", 
     "Q2":"D", 
     "Q3":"D" 
    }] 
    }] 
} 
+0

你可以向你的助手展示'Answers'嗎?你的文檔不包含任何數組,所以你需要構建一個。 – 2015-03-30 18:58:04

回答

0

你usernamesList的範本有一個其他#each用於返回數組的東西。您可以使用助手將要循環遍歷的各種對象轉換爲具有要查看的屬性的對象數組。

我不是100%肯定你要什麼在這裏,但似乎你想要三個環路:給你,上面指定的結構

Users 
    -> Tests 
     -> Answers 

要做到這一點,你可以做什麼像這樣:

<template name='main'> 
    <ul class="list-group nav nav-pills nav-stacked"> 
     {{#each Answers}} 
      {{>usernamesList}} 
     {{/each}} 
    </ul> 
</template> 

<template name='usernamesList'> 
    <li><a href="#" class="list-group-item answer">{{username}}</a></li> 
    <ul><!-- get each test as a sub-bullet --> 
     {{#each usersTests}} 
     <li>{{name}}</li> 
     <ul><!-- get each question's answer as a sub-bullet --> 
      {{#each testAnswers}} 
      <li><strong>{{question}}</strong>: {{answer}}</li> 
      {{/each}} 
     </ul> 
     {{/each}} 
    </ul> 
</template> 

然後,只需重新格式化你的數據在陣列與適當的助手:

Template.main.helpers({ 
    Answers: function() { return Answers.find(); } // assumes you are returning a cursor that looks exactly as your collection is defined above 
    }); 

Template.usernamesList.helpers({ 
    usersTests: function() { // Convert the `test` object into an array of objects: 
    var test = this.test; 
    return _.map(Object.keys(test), function(key) { 
     var answers = _.map(Object.keys(test[key]), function(question) { // also go ahead and convert this to objects 
     return {question: question, answer: test[key][question]}; 
     }); 

     return {name: key, testAnswers: answers}; // resulting array looks like [{test: 'T1', testAnswers: [{question: 'Q1', answer: 'A', ...}]}] 
    }); 
    } 
}); 

一旦他們是陣列,你可以通過{{#each}}迭代它們。認清{{#each}}塊內的HTML會得到你迭代的數據上下文對象 - 因此,例如,當我們遍歷的userTests結果,數據上下文現在在格式的對象:

{test: 'T1', 
    testAnswers: [{question: 'Q1', answer: 'A', ...}] 
} 

所以testAnswers可以直接作爲數組訪問。然後,我們可以通過調用{{#each testAnswers}}遍歷該陣列,並且在格式

{question: 'Q1', answer: 'A'} 

一個目的是現在的數據上下文,這意味着questionanswer鍵可用。

根據您的使用情況以及您對集合中的這些對象所做的操作,我可能會建議將它們作爲數組存儲在集合本身中,以便您不必通過從對象到數組的映射在usersTests幫手完成。