Utilisation de l’interpolation dans Node.js EJS comprend

Mon application Express utilise EJS et mon répertoire de vues ressemble à ceci:

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

J’essaie de charger home.ejs dans ma vue layout.ejs de manière conditionnelle en fonction d’une variable locale nommée content dans mes routes / index.js. Ce fichier ressemble à ceci:

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

Idéalement, je pourrais simplement écrire (dans layout.ejs):

  

où le “contenu” final est la variable locale qui contient le chemin relatif au corps du texte à charger.

Mais hélas, il semble que EJS interprète toujours le texte en suivant littéralement une directive include , et qu’il n’ya aucune chance pour qu’une magie d’interpolation se produise.

J’ai aussi essayé en vain:

      

Quelqu’un a-t-il une solution créative pour inclure conditionnellement une vue basée sur une variable passée dans des itinéraires?

Je pense qu’il n’y a aucun moyen de faire ce genre de dynamic inclut dans EJS. Cela pourrait briser la séparation entre la logique métier et la vue. La solution peut consister à restituer le sous-modèle dans le contrôleur et à transmettre son contenu à la présentation.

Pour rendre le sous-modèle dans le contrôleur, utilisez quelque chose comme ceci:

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

Dans la version 2 de EJS, la fonction include fait bien. Avec elle, les inclus sont insérés au moment de l’exécution pour que les variables puissent être utilisées comme chemins.

Dans ce cas, la solution peut être:

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

La fonction peut aussi avoir un autre argument si nécessaire:

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

Le chemin doit être relatif au modèle qui appelle la fonction.

Actuellement, ceci n’a pas été implémenté dans ejs mais, il y a cette discussion et cette demande d’extraction qui offre la fonctionnalité.

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

Dans votre fonction de rendu, vous pouvez inclure fs.readFileSync et __dirname .

Rendez votre page avec des options comme celle-ci

 res.render('pages/'+req.file,{file_get_contents:fs.readFileSync,__dirname:__dirname}); 

Ensuite, vous pouvez l’utiliser dans votre page .ejs comme ceci. Cela rest du côté du serveur.

 <% var products=JSON.parse(file_get_contents(__dirname+'/web/data/products.json','utf8')) %> 

Vous pouvez imprimer les données sur le client HTML comme ceci.

 <%- JSON.stringify(products)%> 

Remarque: L’utilisation de cette méthode signifie que vous avez inclus fs quelque part en haut de votre script.

 var fs = require('fs')