node.js - quick - sgdq 2018 live
Usa una variable en Jade include (4)
¿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
Estoy trabajando con Jade y Express y me gustaría utilizar una variable en mi declaración 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 }
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 dinámico.
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 compilar.