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

15

我的Express应用程序使用EJS,我的视图目录如下所示:

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

我想要根据我的routes/index.js文件中的一个名为contents的本地变量的条件,有条件地在layout.ejs视图中加载home.ejs。该文件看起来像这样:

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Home', contents: 'home.ejs' });
};
理想情况下,我可以简单地编写以下内容(在layout.ejs中):
<% include '/contents' + contents %>

“contents”是包含要加载的正文相对路径的局部变量。

但不幸的是,似乎EJS总是按照字面意义解释 include 指令后面的文本,没有任何插值魔法的机会。

我也试过了,但没有成功:

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

有没有人有创造性的解决方案,可以根据在路由中传递的变量来有条件地包含一个视图?


3
+1,如果include不能是动态的,那么它有什么意义?我不知道如何使用它。 - Farzher
4个回答

4

我认为在EJS中没有办法做这种动态包含。这可能会破坏业务逻辑和视图之间的分离。

解决方案可以是在控制器中渲染子模板,并将其内容传递给布局。

要在控制器中渲染子模板,请使用以下代码:

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

2
在 EJS 的第二个版本中,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')

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接