【问题标题】:Using interpolation within Node.js EJS includes在 Node.js EJS 中使用插值包括
【发布时间】:2012-08-02 00:45:32
【问题描述】:

我的 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 %>

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

但是,可惜的是,EJS 似乎总是按字面意思解释 include 指令之后的文本,并且不可能发生任何插值魔法。

我也试过了,没用:

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

有没有人有创造性的解决方案来有条件地包含基于路由中传递的变量的视图?

【问题讨论】:

  • +1,如果不能动态包含有什么意义?我不知道如何使用它。

标签: node.js include express ejs


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    目前这还没有在 ejs 中实现,但是有这个讨论和 pull request 提供了这个功能。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2020-08-01
          • 2012-11-12
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多