2014-01-22 184 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