7

オブジェクトの配列を EJS テンプレートに渡しています。これは、配列の通常の .map() メソッドを使用してリンクにマップしたいと考えています。しかし、私が理解できない理由により、map() に渡すコールバックは、EJS 内で期待どおりに機能せず、空の結果が得られます。

私のデータはオブジェクトの配列で、それぞれに「セクション」と「名前」キーがあります。この配列は「エントリ」としてテンプレートに渡されます。

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

テンプレートは次のようになり、 (surprise) というローカル変数に含まれています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>

私が得られないのは、対応するマップ呼び出しが REPL でうまく機能するときに、これが EJS テンプレートで機能しない理由です。

> 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>' ]
>

手がかりはありますか?

4

3 に答える 3

7

このコードは動作するはずです:

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

関数内で単純な html を使用することはできません。ループと条件でのみ可能です。

于 2012-11-06T23:23:52.470 に答える
3

join(' | ') ほどきれいではありませんが、連結したくない場合は、次のようにすることができます。

<% entries.forEach(function(entry, i, entries){ %>
    <a href="<%= entry.section %>"><%= entry.name %></a>
    <%= i == entries.length-1 ? ' | ' : '' %>
<% } %>
于 2012-11-07T04:30:09.153 に答える