2012-11-06 33 views
2

我將一個對象數組傳遞給一個EJS模板,我想使用數組的常規.map()方法將其映射到鏈接。但由於我無法弄清楚的原因,我傳遞給map()的回調在EJS中不能像我期望的那樣工作,而且我得到的結果是空的。EJS是否處理array.map(callback)?

我的數據是一個對象數組,每個對象都有一個「section」和一個「name」鍵。

siteHeaders = [ { section: "home", name: "Home"}, 
       { section: "about", name: "About Me"}, 
       ... plus few more ] 

模板看起來是這樣的,我把它叫做(驚訝)template一個局部變量:此數組作爲「項」爲模板通過

<% entries = entries.map(function(elem) { -%> 
    <% return -%> 
    <a href="/<%= elem.section %>"> 
    <%= elem.name %> 
    </a> 
<% }) -%> 
<p><%- entries.join(" | ") %></p> 

這樣做的結果模板,當我打電話require('ejs').render(template, {entries: siteHeaders})是:

  <p> | | | | </p> 

我不明白的是爲什麼這並不在EJS模板,當相應的地圖調用工作就好R中工作EPL:

> siteHeaders.map(function(e){ return '<a href="/' + e.section +'">' + e.name + '</a>' }) 
[ '<a href="/home">Home</a>', 
    '<a href="/guide">About Me</a>', 
    '<a href="/quickstart">Portfolio</a>', 
    '<a href="/reference">Blog</a>', 
    '<a href="/downloads">Contact</a>' ] 
> 

任何線索?

+0

我只是好奇,爲什麼你要使用地圖,而不是entries.forEach()並直接輸出你的html。 – chovy

+0

沒有特別的理由,除了表達通過join()方法在每個條目之間放置管道符號的想法之外,似乎更加清晰。請參閱下面的Vadim Baryshev的回答。 –

回答

2

此代碼應工作:

<% entries = entries.map(function(elem) { 
    return '<a href="/' + elem.section + '">' + elem.name + '</a>'; 
}) -%> 
<p><%- entries.join(" | ") %></p> 

無法使用的功能,裏面簡單的HTML。只有在循環和條件下才有可能。

+0

無賴。是的,我想到了您的解決方案,但從哲學角度來說,這回到了手動鏈接字符串來構建HTML的舊世界,這些模板系統應該讓我們從中解脫出來。這讓我感到困惑,所以我認爲我會以更節點的方式嘗試它。謝謝你的提示! –

1

這不是那樣乾淨加盟(「|」),但如果你不想來連接,你可以這樣做:

<% entries.forEach(function(entry, i, entries){ %> 
    <a href="<%= entry.section %>"><%= entry.name %></a> 
    <%= i == entries.length-1 ? ' | ' : '' %> 
<% } %>