2012-08-03 98 views
15

我快速的应用程序使用EJS,和我的看法目录如下:使用插包括

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

我想有条件基于加载home.ejs我layout.ejs视图在我的routes/index.js中的一个名为contents的本地变量上。这个文件看起来是这样的:

/* 
* GET home page. 
*/ 

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

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

<% include '/contents' + contents %> 

在结尾的“内容”是含有对身体的相对路径的局部变量文本加载。

但是,可惜的是,看起来EJS总是按照字面上的include指令解释文本,并且没有机会发生任何插值魔术。

我也试过无济于事:

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

是否有人在有条件包括基于在路线传递一个变量视图创造性的解决方案?

+0

有没有解决这个问题? – 2012-09-30 15:16:20

+3

+1,如果它不能动态的话,包括什么?我不知道如何使用它。 – 2012-11-04 18:37:03

回答

4

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

对于控制器使用这样的渲染子模板:

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

在EJS的2版本中,include功能是否良好。有了它,include就会在运行时插入,所以变量可以用作路径名。

在这种情况下,该解决方案可以是:

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

该功能也可以有另一种说法,如果必要:

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

路径名具有可相对于该调用该函数的模板。

0

在渲染功能,您可以包括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')