EJS中的动态模板(node.js)

3

有没有人知道一种好的解决方案,可以在运行时仅知道模板名称时包含模板? EJS 的包含仅允许指定确切的文件/模板名称。

用例:我有一个文章布局,其中包含某些本地文件中的文章 HTML/EJS 内容。

为此,我需要类似 https://github.com/visionmedia/ejs#includes 的东西,但文件名应从 locals 变量中获取:

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

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>

有没有可能这样做,或者唯一的选择是加载文章内容并将其放入articleContent中,以便通过<%- articleContent %>访问?

这种解决方案的问题是,文章的内容应该是纯HTML(`<%--%>'不插值)。因此,如果我需要在文章中使用任何EJS功能,则需要自行编译/渲染。

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


我已经编辑了你的问题,因为它很难阅读。如果更改了意义,请恢复更改。此外,“文件名应从变量中获取”是什么意思?您是否在多个文件之间共享内容?此外,我不理解整个“文章内容应该是纯HTML”的问题。 - verybadalloc
抱歉... 我的思维集中在寻找解决方案上了。已经修改文本以使其更易理解 :) - Valentyn Shybanov
据我所知,使用VM模块可以在EJS和Express中实现这一点,但对我来说感觉有些混乱。由于我在EJS和DUST之间犹豫不决,我选择了DUST来完成当前的项目。这里有一个动态命名的部分'included template file with DUST - {>"{dynamicvalue}.dust"/}。希望EJS有更简单的答案,因为我喜欢它。 - Rob Sedgwick
2个回答

2

看起来 EJS 现在支持此功能。这是在 v2.0.1: 2015-01-02 中引入的。新的语法如下:

 <%- include(articleContent) %>

为了让这个工作正常运行,我需要在Express中禁用缓存,设置如下:

要使此功能生效,我必须通过以下方式在Express中禁用缓存:

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

0

你可以使用以下这个筛选器:

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

干杯!


有趣的解决方法。但在这种情况下,从内部“render”父范围/上下文将无法访问...因此,它就像是“隔离”的渲染,而不是实际的_include_... - Valentyn Shybanov
EJS ^2.0.* 支持此功能:现在可以使用基于变量的包含。 - Norberto Bezi

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