Node.js 将数据传递到EJS包括

Node.js 将数据传递到EJS包括,node.js,express,ejs,Node.js,Express,Ejs,我正在尝试在EJS中实现递归包含。我正在使用ExpressJS4。我需要能够有选择地将数据传递到include。我的“子”变量随着循环迭代而变化,因此无法全局工作。 然而,我得到了“超过了最大调用堆栈大小”,这意味着部分中的if语句总是计算为true 这是我的主要HTML: <ul id="drop1" data-dropdown-content class="f-dropdown"> <% agents.forEach (function(sub) { var subs =

我正在尝试在EJS中实现递归包含。我正在使用ExpressJS4。我需要能够有选择地将数据传递到include。我的“子”变量随着循环迭代而变化,因此无法全局工作。 然而,我得到了“超过了最大调用堆栈大小”,这意味着部分中的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>
这是我的include(dropdown.html):

更新: 即使这样也不行:

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

我将尝试

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

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


让我知道这是否对您有效;如果不起作用,我很乐意进一步调查。

这是一个很好的答案!不幸的是,它不起作用。我仍然得到“超过最大调用堆栈大小”。最有可能的是子变量是相同的,并且总是通过测试。但我感到鼓舞的是,我们已经很接近了。我已经尝试了一切。它只是没有像预期的那样更改每次迭代的“子”变量。请检查此项
<a href="#"><%= sub.fname +' ' +sub.lname %></a>
<% if (sub.agents && sub.agents.length) { %>
    <% (function() { %>
        <% var subs = sub.agents; %>
        <% include dropdown.html %>
    <% })(); %>
<% } %>