2014-01-22 187 views
0

从子文档使用的数组元素我有一个蒙戈文件是这样的:流星:在模板

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

...我希望能够用我的内容:上面我模板。对于我的路线,我有这样的:

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> 

所以,问题是:如何创建一个模板助手(或把手助手),让“互动'in {{interaction.q}}等引用了字段'i'中的特定数组元素?或者有另一种方法可以达到同样的效果吗?在这一点上,我不在乎我是否可以传递一个参数给帮手来获取它。如果必须,可以从会话变量中获取数组的索引。

回答

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} 
    } 
}); 

感谢肖恩指出我正确的方向与他的答案。

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关键字定义,否则你正在写一个全局变量 - 这迟早会导致冲突。

+0

感谢有关变种的信息。我认为函数内部未声明的变量是本地的。如果我继续沿着这条路走下去,那会导致一个非常神秘的混乱局面! –

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; 
    } 
}); 

而且,你不要在你的模板的each循环体写出的数据时需要的interaction.前缀。您的模板应该是这个样子,而不是:

<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> 
+0

这给出了错误:“来自Deps重新计算的异常:错误:{{#each}}只接受数组,游标或falsey值,您传递:[object Object]”但这个想法给了我一些新的想法。所以我仍然在努力!最大的问题是试图从i字段中获取特定的元素,这是一个对象数组。 –

+0

也许您的数据结构与您在问题中发布的内容不同?我尝试了我的解决方案,并且一切似乎都正常。您可以尝试在路由的'data'函数中添加一个'console.log(templateData);'行来查看实际内容。 – Sean

+0

下面是我创建的两个文件的内容,用于测试[app.js](http://pastebin.com/YaqSg0qE)和[templates.html](http://pastebin.com/86n3CnUh)。 – Sean