2014-05-12 74 views
0

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

这是我的主要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> 

UPDATE: 即使这不起作用:

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

即将试用JUST

+0

检查了这个http://stackoverflow.com/questions/34622011/node-ejs-passing-data-to-an-include –

回答

1

从技术上讲,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 %> 
    <% })(); %> 
<% } %> 

让我知道这是否为你的作品;如果没有,我很乐意进一步调查。

+0

这是一个辉煌的答案!不幸的是,它不起作用。我仍然收到“超出最大调用堆栈大小”。最有可能的subs var是相同的,并且总是通过测试。 但我感到鼓舞,我们很接近。 –

+0

我试过了一切。它不会像预期的那样改变每次迭代的'sub'var。 –