在Node.js中使用插值EJS包括

我的快车应用程序正在使用EJS,我的视图目录如下所示:

./views ./contents home.ejs ./includes header.ejs footer.ejs layout.ejs 

我试图加载home.ejs在我的layout.ejs视图有条件地基于本地variables命名contents在我的routes / index.js。 该文件看起来像这样:

 /* * GET home page. */ exports.index = function(req, res){ res.render('index', { title: 'Home', contents: 'home.ejs' }); }; 

理想情况下,我可以简单地写(在layout.ejs中):

 <% include '/contents' + contents %> 

尾部的“contents”是包含要加载的正文文本的相对path的局部variables。

但是,唉,看起来EJS总是按照一个include指令的字面意思解释文本,而且没有任何插值魔法发生的机会。

我也试图无济于事:

 <% function yieldContent(contents){ %> <% var contentPath = 'contents/' + contents; %> <% include contentPath %> <% }; %> <% loadContent(); %> 

有没有人有一个创造性的解决scheme,有条件地包含基于path中传递的variables的视图?

我认为在EJS中没有办法做这种dynamic的包含。 这可能会打破业务逻辑和视图的分离。 解决scheme可以是在控制器中渲染子模板,并将其内容传递给布局。

为了在控制器中渲染子模板,使用如下所示:

 var ejs = require('ejs'), , fs = require('fs') , home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8")) 

在EJS的第二版中, include函数做得很好。 有了它,include就会在运行时插入,所以variables可以用作path名。

在这种情况下,解决scheme可能是:

 <%- include('contents/' + contents) %> 

如有必要,该函数还可以有另一个参数:

 <%- include('mypathname', {foo:"bar"}) %> 

path名必须相对于调用该函数的模板。

目前这个还没有被实现到ejs中,但是,这个讨论和请求提供了这个function。

https://github.com/visionmedia/ejs/issues/93

在渲染函数中你可以包含fs.readFileSync__dirname

用这样的选项渲染你的页面

 res.render('pages/'+req.file,{file_get_contents:fs.readFileSync,__dirname:__dirname}); 

那么你可以像这样在你的.ejs页面中使用它。 这仍然在服务器端。

 <% var products=JSON.parse(file_get_contents(__dirname+'/web/data/products.json','utf8')) %> 

您可以像这样在客户端HTML上打印数据。

 <%- JSON.stringify(products)%> 

注意:使用这个方法意味着你将fs包含在脚本的顶部。

 var fs = require('fs')