动态显示json对象

时间:2013-09-10 08:54:16

标签: javascript json coffeescript meteor

我在集合中有一个json对象,我需要在页面上显示它。 这是我做的: 我先调用helpers template,然后从集合中获取json对象: 我正在使用coffeescirpt和jade-handlebars,这里是我在coffeescript中的代码:

Template.test.helpers
  test: ->
    test = Question.find().fetch(); 
    test

当我执行Question.find().fetch()时,在控制台中会发生以下情况:

QuestionData: Object
question1: "How many kids do I have ?"
question2: "when will i die ?"
question3: "how many wife do i have ?"
question4: "test"
__proto__: Object
_id: "w9mGrv7LYNJpQyCgL"
userid: "ntBgqed5MWDQWY4xt"
specialNote: "Rohan ale"

当我通过以下方式调用模板时,现在在玉石中:

template(name="hello")
  .test {{QuestionData}}

我只能看到[object] [object]。要查看问题1,问题2我必须执行以下操作:

template(name="hello")
  .test {{QuestionData.question1}}, {{QuestionData.question2}}

如何在不执行{{QuestionData.question1}} ...

的情况下动态显示所有问题

提前谢谢!!!

4 个答案:

答案 0 :(得分:2)

您可以在循环中动态组合字段名称。

b = { q1: 'a1', q2: 'a2', q3: 'a3' };
for (x=1;x<=3;x++) { console.log( b[ 'q' + x ] ) }

话虽如此,这里有很多似乎是对我的误解。我退一步说你应该考虑每个mongo文档存储一个问题。这为您提供了最简单的流星数据。或者,将多个问题存储在数组中:

test = {
  questions : [ 
    "How many kids do I have ?"
    "when will i die ?"
    "how many wife do i have ?"
    "test" ] ,
userid: "ntBgqed5MWDQWY4xt",
specialNote: "Rohan ale"
}

当您考虑如何存储答案,对问题进行排序等时,问题就出现了。可能是一个名为问题的集合,其中一个字段可能称为sortOrder,一个称为标记的字段等。

你是如何通过这种方式获取调用模板的,而不是将它们作为路由器为你管理的html文件?

答案 1 :(得分:2)

而不是仅使用Questions.find()。fetch()返回json对象,您可以添加另一个步骤将数据放入如下数组中:

test = function() { 
  var temp = [];
  for (item in Questions.find().fetch()) {
    temp.push(item);
  };
  return temp;
};

return test;

(抱歉不写咖啡脚本,我不知道语言抽象)

答案 2 :(得分:2)

要回答你关于如何做的问题,你可以做这样的事情(在JS中,抱歉,不是咖啡章节):

Template.Questionnaire.questions = function () {
    var questions = [];
    _.each(Object.keys(this), function (field) {
        if(/^question.+/.test(field)) {
            questions.push({ label: field, question: this[field]});
        }            
    });
    return questions;
};

然后在模板中:

<template name="Questionnaire">
{{#each questions}}
    <label>{{label}}</label>
    <span>{{question}}</span>
{{/each}}
</template>

这样的事情。但我同意Jim Mack的意见,你应该把它存放在一个数组中。

答案 3 :(得分:0)

像JIm Mack一样发布,将你的收藏保存在一个数组中 首先在coffeescript中将这些问题插入数组:

x = document.getElementById('question-form')
    length = x.length

    i = 0
    question = []
    while i< length
      aaa = x.elements[i]
      question.push
        questions: aaa
      i++

然后因为你使用的是Jade-handlebars,你需要注册助手 在您的玉文件中执行这些

 {{#each arrayify myObject}}
                  {{#each this.name}}
                    p {{questions}}
                  {{/each}}

        {{/each}}

arrayifymyObject是车把助手。然后在你的coffeescript

Handlebars.registerHelper "arrayify", (obj) ->
  result = []
  for temp in obj
    userQuestion = temp.question
    result.push
      name: userQuestion
  return result

Template.templatename.myObject = ->
  temp = []
  for item in Question.find().fetch()
    temp.push item
  return temp

希望这些能够奏效。