【问题标题】:Pass data to EJS include将数据传递给 EJS 包括
【发布时间】:2014-06-30 04:20:55
【问题描述】:

我正在尝试在 EJS 中实现递归包含。我正在使用 ExpressJS 4。我需要能够有选择地将数据传递给包含。我的“子”变量随循环迭代而变化,因此无法全局工作。 但是,我得到“超出最大调用堆栈大小”,这意味着部分中的 if 语句始终评估为 true。

这是我的主要 HTML:

<ul id="drop1" data-dropdown-content class="f-dropdown">
<% agents.forEach (function(sub) { var subs = sub.agents; %>
<li>
    <a href="#"><%= sub.fname +' ' +sub.lname %></a>
    <% if (subs) { %>
    <% include dropdown.html %>
    <% } %>
</li>
<% }); %>
</ul>

这是我的包含(dropdown.html):

<ul class="f-dropdown">

    <% subs.forEach(function(sub) { %>
    <li>
    <a href="#"><%= sub.fname +' ' +sub.lname %></a>
    <% if (sub.agents && sub.agents.length) {subs = sub.agents; %>
    <% include dropdown.html %>
    <% } %>
    </li>
    <% }); %>

</ul>

更新: 即使这样也行不通:

<ul class="f-dropdown">
    <% if (sub.agents && sub.agents.length > 0) { %>
        <% (function(subs) { %>
            <% include dropdown.html %>
        <% })(sub.agents); %>
    <% } %>
</ul>

我要试试JUST

【问题讨论】:

标签: node.js express ejs


【解决方案1】:

从技术上讲,visionmedia ejs 库不支持将参数传递到包含中。但是它可以很好地处理普通的 javascript,因此您可以尝试使用 IIFE 闭包来处理范围更改:

<a href="#"><%= sub.fname +' ' +sub.lname %></a>
<% if (sub.agents && sub.agents.length) { %>
    <% (function() { %>
        <% var subs = sub.agents; %>
        <% include dropdown.html %>
    <% })(); %>
<% } %>

让我知道这是否适合您;如果没有,我很乐意进一步调查。

【讨论】:

  • 这是一个绝妙的答案!不幸的是,它不起作用。我仍然得到“超出最大调用堆栈大小”。很可能 subs var 是相同的并且总是通过测试。但我感到鼓舞的是,我们已经很接近了。
  • 我什么都试过了。它只是没有按预期更改每次迭代的“子”变量。
猜你喜欢
  • 2014-01-30
  • 2016-04-09
  • 1970-01-01
  • 2016-10-06
  • 2018-04-09
  • 1970-01-01
  • 2019-08-01
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多