15

My Express app is using EJS, and my views directory looks like this:

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

I'm trying to load home.ejs in my layout.ejs view conditionally based on a local variable named contents in my routes/index.js. That file looks like this:

/*
 * GET home page.
 */

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

Ideally I could simply write (in layout.ejs):

<% include '/contents' + contents %>

where the trailing "contents" is the local variable which contains the relative path to the body text to load.

But alas, it appears EJS always interprets the text following an include directive literally, and there is no chance for any interpolation magic to happen.

I've also tried to no avail:

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

Does anyone have a creative solution for conditionally including a view based on a variable passed in routes?

4

4 回答 4

4

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

对于在控制器中渲染子模板,请使用以下内容:

var ejs = require('ejs'),
, fs = require('fs')
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8"))
于 2012-08-04T06:55:50.313 回答
2

在 EJS 的第 2 版中,该include功能做得很好。有了它,包含在运行时插入,因此变量可以用作路径名。

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

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

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

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

路径名必须相对于调用函数的模板。

于 2015-06-21T21:07:20.123 回答
0

目前这还没有在 ejs 中实现,但是有这个讨论和提供该功能的请求请求。

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

于 2014-05-30T08:52:04.633 回答
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')
于 2017-07-11T01:48:59.140 回答