Modèles dynamiques dans EJS (node.js)

Est-ce que quelqu'un connaît une belle solution pour inclure des modèles, dont les noms ne seraient connus que par temps courant? EJS comprend permet de spécifier uniquement le nom exact du fichier / modèle.

Cas d'utilisation : j'ai une disposition d'article et il y a un article HTML / EJS contenu dans un fichier local.

Pour ce faire, j'ai besoin de quelque chose comme https://github.com/visionmedia/ejs#includes mais le nom du fichier doit être pris à partir de la variable locale:

Supposons que j'ai un tel gestionnaire (simplifié):

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

Et dans article.ejs (supposons avoir des ex-locals):

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

Existe-t-il une possibilité de le faire ou la seule option est de charger le contenu de l'article et de le mettre dans articleContent, donc disponible par <%- articleContent %> ?

Le problème avec cette solution est que le contenu de l'article devrait être simple html (`<% – -%> 'ne pas interpoler la valeur). Donc, si dans l'article, je dois utiliser n'importe quelle fonctionnalité EJS, je dois compiler / rendre par moi-même.

Peut-être que quelqu'un d'autre sait déjà comment cela peut être fait avec un assistant dynamique inclus pour EJS, donc pas besoin de code supplémentaire?

On dirait que cela est maintenant pris en charge dans EJ S. Il a été introduit dans v2.0.1: 2015-01-02 . La nouvelle syntaxe ressemble à ceci

  <%- include(articleContent) %> 

Pour que cela fonctionne, j'ai dû désactiver la mise en cache dans Express en configurant:

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

Vous pouvez utiliser un filtre comme ceci:

 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}); } 

Sur votre modèle, utilisez simplement:

 <%-: article | article_teaser %> 

À votre santé!