2012-11-06 28 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 ? ' | ' : '' %> 
<% } %>