【问题标题】:Dynamic templates in EJS (node.js)EJS (node.js) 中的动态模板
【发布时间】:2014-01-13 13:42:09
【问题描述】:

有没有人知道一个很好的包含模板的解决方案,其名称只能在运行时知道? EJS 的包含只允许指定确切的文件/模板名称。

用例:我有一个文章布局,并且在某个本地文件中有文章 HTML/EJS 内容。

为此,我需要https://github.com/visionmedia/ejs#includes 之类的东西,但文件名应取自本地变量:

假设我有这样的处理程序(简化):

app.get('/article/:article', function (req, res) {
        var articleContent = req.params.article;
        res.locals.articleContent = 'data/'+articleContent;
        return res.render('article.ejs')
    })

在 article.ejs 中(假设有 ejs-locals):

<% layout('layout') -%>
<section>
  <article class="single-country">
      <% include ???articleContent???  %>
  </article>
</section>

是否有可能这样做或者唯一的选择是加载文章内容并放入文章内容中,以便&lt;%- articleContent %&gt; 提供?

这个解决方案的问题是文章的内容应该是纯html(`' 不插入值)。因此,如果在文章中我需要使用任何 EJS 功能,我需要自己编译/渲染。

也许其他人已经知道如何使用 EJS 的一些动态包含帮助器来完成此操作,因此不需要额外的代码?

【问题讨论】:

  • 我已经编辑了您的问题,因为它很难阅读。如果更改了含义,请还原我的更改。另外,file name should be taken from variable. 是什么意思?您是否在多个文件之间共享内容?另外,我不明白整个content of the article should be plain HTML 问题
  • 对不起...我的想法集中在寻找解决方案上。将文本更改为更易于理解:)
  • AFAIK 这可以通过 EJS 实现,并通过使用 VM 模块来表达,这对我来说感觉很乱,而且当我在 EJS 和 DUST 之间徘徊时,我选择了 DUST 进行当前项目。 - 这是一个动态命名的部分'包含模板文件,带有 DUST - {>"{dynamicvalue}.dust"/}。我希望ejs有一个更简单的答案,因为我喜欢它。

标签: javascript node.js express ejs


【解决方案1】:

Looks like this is now supported in EJS。它是在v2.0.1: 2015-01-02 中介绍的。新语法如下所示

 <%- include(articleContent) %>

要让它工作我必须通过设置禁用 Express 中的缓存:

app.set('view cache', false);

【讨论】:

    【解决方案2】:

    您可以使用这样的过滤器:

    var ejs = require('ejs');
    var fs = require('fs');
    
    ejs.filters.article_teaser = function(my_object) {
        return ejs.render(fs.readFileSync(__dirname + '/views/' + my_object.template + '.ejs', 'utf8'), {my_object: my_object});
    }
    

    在您的模板上使用:

    <%-: article | article_teaser %>
    

    干杯!

    【讨论】:

    • 有趣的解决方法。但在这种情况下,从内部“渲染”父范围/上下文将无法访问......所以它就像“孤立”渲染而不是实际的 include...
    • EJS ^2.0.* 支持此功能:现在可以使用基于变量的包含
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2018-12-23
    • 2012-08-13
    • 1970-01-01
    • 2012-01-29
    • 2014-08-20
    相关资源
    最近更新 更多