summer sgdq quick gdq games game done agdq node.js express pug

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.