我的 Express 应用正在使用 EJS,我的 View 目录如下所示:
./views
./contents
home.ejs
./includes
header.ejs
footer.ejs
layout.ejs
我正在尝试根据我的 routes/index.js 中名为 contents
的局部变量有条件地在我的 layout.ejs View 中加载 home.ejs。该文件如下所示:
/*
* 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(); %>
有没有人有创造性的解决方案,可以根据路由中传递的变量有条件地包含 View ?
最佳答案
我认为没有办法在 EJS 中进行这种动态包含。它可能会打破业务逻辑和 View 的分离。 解决方案可以是在 Controller 中渲染子模板,并将其内容传递给布局。
要在 Controller 中渲染子模板,请使用以下内容:
var ejs = require('ejs'),
, fs = require('fs')
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8"))
关于node.js - 在 Node.js EJS 中使用插值包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11804691/