2015-03-30 157 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帮手完成。