在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。
在渲染函数中你可以包含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')