Meteor:使用模板中子文档中的数组元素

时间:2014-01-22 01:16:42

标签: templates meteor

我有一个像这样的Mongo文件:

{
    stKey: "apples001",
    i: [        
        {q: "What are apples?", a1: "Apples are fruits.", a2: "Fruit."},
        {q: "How do apples taste?", a1: "Apples taste sweet.", a2: "Sweet."} 
    ]
} 

...我希望能够在我的模板中使用i:上面的内容。对于我的路线,我有这个:

  this.route('teacherCue', { 
  path: '/',
  data: function() {
      templateData = { interactionSet: PL.find( 
          {stKey: 'apples001'}
      )};
      return templateData;
  }
});

我的模板如下所示:

<template name="teacherCue">

    {{#each interactionSet}}

      <a href="#">{{interaction.q}}</a>
        <ul>        
            <p><a href="#">{{interaction.a1}}</a> </p> 
            <p><a href="#">{{interaction.a2}}</a> </p>   
        </ul>

    {{/each}}

</template>

所以问题是:我如何创建一个模板助手(或一个Handlebars助手),以便&#39;互动&#39;在{{interaction.q}}等中引用了字段中的特定数组元素&#39; i&#39;?或者是否有其他方法可以实现同样的结果?此时,我不在乎是否可以将参数传递给帮助程序以获取它。如果必须的话,可以从会话变量中获取数组的索引。

3 个答案:

答案 0 :(得分:2)

您不需要其他助手来访问已定义的数据,只需将其与this关键字一起使用:

{{#each interactionSet}}
  <a href="#">{{this.q}}</a>   
    <ul>        
        <p><a href="#">{{this.a1}}</a> </p> 
        <p><a href="#">{{this.a2}}</a> </p>   
    </ul>
{{/each}}


您的代码中也有错误。 templateData应使用var关键字定义,否则您将写入全局变量 - 这迟早会导致冲突。

答案 1 :(得分:1)

数组位于mongo记录的i属性中,因此您只想在interactionSet模板变量而不是整个记录中返回该数组。此外,您需要使用findOne而不是find,因为您正在寻找特定记录。像这样修改你的代码:

this.route('teacherCue', { 
  path: '/',
  data: function() {
    var record = PL.findOne({stKey: 'apples001'});
    var templateData = { interactionSet: record.i };
    return templateData;
  }
});

此外,在模板的interaction.循环体内写出数据时,不需要each前缀。您的模板应该看起来像这样:

<template name="teacherCue">

    {{#each interactionSet}}

        <a href="#">{{q}}</a>
        <ul>        
            <p><a href="#">{{a1}}</a> </p> 
            <p><a href="#">{{a2}}</a> </p>   
        </ul>

    {{/each}}

</template>

答案 2 :(得分:0)

好的,这个需要花费很多时间来解决,并且可能有一种更简单的方法,但这里有一种方法可以将子文档中的特定数组元素作为模板数据返回。最初,我试图使用#each为模板建立数据上下文,但这只是令人困惑的东西,b / c我不想迭代结果集,我想为我使用单个文档数据。具体来说,我想使用一个对象,该对象是该文档中对象数组的一个元素;并将该对象的不同值分配给模板值,例如{{myValue1}}。

所以我必须要做的是使用jQuery(它给我一个对象数组)将我的对象数组字段转换为“真实数组”,然后访问该数组中的正确元素并转动进入阵列!最后,要访问所需对象中的各个值对,我必须使用myArray [0] .fieldName之类的语法。

this.route('teacherCue', {

  path: '/',

  data: function() {

      desiredIndex = 0;

      var record = PL.findOne( {stKey: 'apples001'} );

      var objArray = $.makeArray( record.i );

      iArray = $.makeArray( objArray[desiredIndex] );

      return {q: iArray[0].q, a1: iArray[0].a1, a2: iArray[0].a2, q2: iArray[0].q2}
  }
});

感谢Sean用他的答案指出了正确的方向。