Usa una variable en Jade include

Estoy trabajando con Jade y Express y me gustaría utilizar una variable en mi statement de inclusión. Por ejemplo:

app.js

app.get('/admin', function (req, res) { var Admin = require('./routes/admin/app').Admin; res.render(Admin.view, { title: 'Admin', page: 'admin' }); }); 

layout.jade

 - var templates = page + '/templates/' include templates 

Cuando hago esto obtengo el error EBADF, Bad file descriptor 'templates.jade'

Incluso intenté

 include #{templates} 

en vano.

AFAIK JADE no es compatible con dynamic inclusive. Lo que sugiero es “incluir” fuera de la plantilla, es decir,

app.js

 app.get('/admin', function (req, res) { var Admin = require('./routes/admin/app').Admin; var page = 'admin'; var templates = page + '/templates/'; // render template and store the result in html variable res.render(templates, function(err, html) { res.render(Admin.view, { title: 'Admin', page: page, html: html }); }); }); 

layout.jade

 |!{ html } 

esto también funciona:

 //controller var jade = require('jade'); res.render('show', {templateRender: jade.renderFile}); //template != templateRender('my/path/'+dynamic+'.jade', options) 

Es probable que esto no aumente el rendimiento que esperaría al utilizar la configuración de ‘caché de vista’ (está activado por defecto en NODE_ENV === ‘producción’). O incluso romper la aplicación (por ejemplo, si los archivos no están disponibles en el disco duro al implementar un nuevo código). También intentar usar este truco en una aplicación isomorfa o del lado del cliente no funcionará porque la plantilla no se puede comstackr.

Encontré esta página buscando la misma pregunta en Google, pero en un contexto diferente, así que pensé en poner mi solución aquí (para la posteridad) aquí para la posteridad:

Quería rodear mi inclusión con más contexto extraído de la variable, por ejemplo, (simplificado):

 - var templates = page + '/templates/' - var headid = page + 'head' - var imgsrc = '/images/' + page div(id=headid) h1 #{page} img(src=imgsrc) div(id=page) include templates 

Como eso no funciona (Jade no admite inclusiones dinámicas, como lo señala un monstruo), hibridé con un mixin:

(Editar- un poco más elegante que mi solución anterior 🙂

 mixin page1 include page1/templates mixin page2 include page2/templates ... - for (var i = 0; i < 3; i++) - var page = 'page' + i - var headid = page + 'head' - var imgsrc = '/images/' + page div(id=headid) h1 #{page} img(src=imgsrc) div(id=page) +page 

Mi respuesta anterior:

 mixin templates(page) - var headid = page + 'head' - var imgsrc = '/images/' + page div(id=headid) h1 #{page} img(src=imgsrc) +templates('page1') #page1 include page1/templates/ +templates('page2') #page2 include page2/templates/ ... 

No es elegante, y no funcionará si necesita incluir más de unas pocas cosas de esta manera, pero al menos parte del Jade es dynamic.

¿Por qué no usar herencia de jade?

Haga lo que quiera en el nivel de middleware:

 res.render('templates/' + template_name + '.jade') 

Escribe common.jade común:

 h1 This is a page .container block sublevel h2 Default content 

A continuación, escriba el archivo que se extiende common.jade :

 extends common.jade block sublevel h2 Some things are here