Meteor如何从mongo db中检索一系列问题,并在应用程序中只显示其中一个问题

时间:2014-06-04 13:35:14

标签: mongodb meteor

由于我是编程和Meteor的新手,我目前正在使用Meteor.js构建一个(简单的)Quizz应用程序。我按照发现流星指南书并将他们的示例显微镜项目重建为测验。 我目前正在努力从mongo数据库中检索一系列问题并在应用程序中只显示其中一个问题。

我的收藏集中的数据目前如下所示:

Quizzes.insert(
    {"quiztitle": "Quiz One",
        "quizquestions": ["Q1.1", "Q1.2"]
    }),

我目前正在展示所有这些

<template name="quizPage">
        <h3>
            {{#each quizquestions}}
            {{> quizQuestion}}
            {{/each}}
        </h3>

<template name="quizQuestion">
<div class="quiz">
    <div class="quiz-content">
        {{this}}
    </div>
</div>

我已经尝试了几种解决方案,只能显示第一个问题:

1.通过带有Spacebars的辅助函数替换数组编号。虽然帮助程序工作(它返回一个特定的数字,例如0),并且数组本身(括号间的0)。 Meteor似乎不允许空格键插入数组括号中。

<template name="quizQuestion">
<div class="quiz">
    <div class="quiz-content">
        {{quizquestions.[{{questionnumber}}]}}
    </div>
</div>

2.a通过mongodb查询返回特定字段。例如

Return Quizzes.find( { quiztitle: 'Quiz One' }, { quizquestion: 1, _id:0, quiztitle: 0 });

不幸的是,这只能在服务器端进行。我还尝试将返回的数组保存到lib文件夹

中的全局变量中
questionArray = Quizzes.find( { quiztitle: 'Quiz One' }, { quizquestion: 1, _id:0, quiztitle: 0 } );

当我尝试切片集合时也会出现这种情况,这是在不同的帖子中提出的

3.由于这似乎也不起作用,我尝试发布集合的一个子集以用于特定的测验。我在这里遇到的问题是该集合似乎是完整的。我通过

在frontpage.js上发布了这个集合
Meteor.subscribe('quizzes');

我也试过在http://docs.meteor.com/#meteor_subscribe

的文档中建议的自动运行中订阅
Deps.autorun(function () {
Meteor.subscribe("quizzes")});

问题:你能帮我找到一种方法只返回问题数组,并将其保存到全局变量或通过帮助器返回。我希望你能帮助我,非常感谢

流星初学者。

2 个答案:

答案 0 :(得分:3)

首先,您需要确保客户端上的数据可用。在Chrome中,打开你的javascript控制台(cmd +选项+ j)并粘贴Quizzes.find().fetch(),你应该看到你的对象。假设这很好,继续......

要显示您的问题,您可以将特定问题返回到{{#with}}块,如下所示:

{{#with question}}
  <li>{{this}}</li>
{{/with}}

你的问题助手可能看起来像这样......

Template.TEMPLATE_NAME.helpers({
 question: function(){
  var currentQuestion = Session.get('currentQuestion') || 0;
  return Quizzes.findOne({}).quizquestions[currentQuestion]
 }
});

然后你可以在每次回答或转到Meteor事件中的下一个问题时递增Session变量,如下所示:

Template.TEMP_NAME.events({   
 'click .next-question': function(){
   var num = Session.get('currentQuestion') + 1;
   Session.set('currentQuestion', num);
 }
});

这将导致帮助程序重新运行,您的新问题将被传递回{{#with}}块。

答案 1 :(得分:0)

quizPage模板中,添加一个帮助程序,找到一个问题:

Template.quizPage.firstQuestion = function() {
  return this.quizquestions[0];
}

然后使用它:

<template name="quizPage">
  <h3>
      <!-- #with is like #each, but for a single item -->
      {{#with firstQuestion}}
        {{> quizQuestion}}
      {{/with}}
  </h3>
</template>