2014-01-10 81 views
21

我在一些地方使用了一个全局标题,我试图在渲染模板时可以传递的变量中定义它的位置。将变量传递给EJS包括

喜欢的东西:

var headerLocation = 'some/location/header.ejs'; 
res.render(viewDir + '/index', { 
     header: headerLocation 
    }); 

而且在模板文件:

<% include header %> 

头是与渲染传递的价值。

这似乎不可能,但也许我错过了一些东西,所以认为我会问这里。

编辑:

这在下面,但总结答案评论中提到,这是目前在EJS的2版本。

在这里看到:https://github.com/mde/ejs#includes 及相关讨论在这里:https://github.com/tj/ejs/issues/93

回答

6

这个功能已经被添加:如果不是路径(找不到文件),它被评估为变量名称。 https://github.com/visionmedia/ejs/pull/156

+4

感谢。在发布这个问题后,我实际上很快遇到了https://github.com/visionmedia/ejs/issues/93。虽然有一个拉的请求,它似乎还没有发布到NPM。希望它会很快被接受和发布。一旦发生这种情况,我会将这个答案标记为正确的,以免误导可能在这里降落的其他人。有趣的是,无论出于何种原因,只有在Windows上,使用节点全局对象才能工作。所以<%include global.somepath%>以某种方式起作用。不过在Mac或Linux上。奇怪的一个。 –

+1

想想用这一行改变bug.push行(在新代码中):buf + =“'+(function(){”+ include +“})()+'”; (可能导致.push出错) – Arthur

+0

我刚试过,在var中存放一个路径并试图用'include'使用var,它仍然尝试使用var名称而不是值。 EJS'1.0.0' – Vadorequest

4

即使它的一个老问题,其回答为别人着想。

根据github文档,似乎EJS没有块的概念,只有编译时包含。由于其编译时间包括,您需要对位置进行硬编码。

所以你留下了一些通过标志和在首部检查或分析标题为html并将其传递给所有的模板做...

18

下面是一些可以实现动态包含的演示代码。

查看

<div flex class="main-container"> 
    <%- include(page) %> 
</div> 

路由器

router.get('/', function (req, res, next) { 
    res.render('pages/index', { 
     page: 'home' 
    }); 
});