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é.
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')