2012-08-26 24 views
47

Estoy trabajando con Jade and Express y me gustaría usar una variable en mi declaración de inclusión. Por ejemplo:Use una variable en Jade include

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 me sale el error EBADF, Bad file descriptor 'templates.jade'

Incluso intenté

include #{templates} 

en vano.

+0

que estaba buscando para esto también . Sorprendido de que esta característica no se haya agregado aún. Bifurcó el repositorio para ver qué tan difícil sería implementar esta funcionalidad. –

Respuesta

41

AFAIK JADE no es compatible con dynamic including. 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 } 
+0

Eso funciona, también. ¡Gracias! –

+2

Parece que llamar a render() dos veces podría afectar negativamente el rendimiento. –

+0

@StephenDavis Sí, pero dudo que alguna vez sea un problema (la base de datos siempre es un cuello de botella). – freakish

6

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

Quería rodear mi inclusión con más contexto extraído de la variable, p. Ej. (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 

Dado que eso no funciona (Jade no soporta dinámico incluye, como señaló anormal), que se hibridó con una mixin:

(Editar- un poco más elegante de lo mi anterior solución :)

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 lo hará w ork si necesita incluir más de unas pocas cosas de esta manera, pero al menos parte del Jade es dinámico.

19

esto también funciona:

//controller 
var jade = require('jade'); 
res.render('show', {templateRender: jade.renderFile}); 


//template 
!= templateRender('my/path/'+dynamic+'.jade', options) 

Esto probablemente no aumentará el rendimiento que se puede esperar de usar el ajuste 'view cache' (está activada de forma predeterminada 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.

+1

Esto es bastante impresionante –

+1

Pero en lugar de llamar a la función con 'context' debería ser' locals' –

+0

http://jade-lang.com/api/ Un objeto de opciones, también utilizado como el objeto locals. Son ambos. – antpaw

1

¿Por qué no utilizar la herencia de jade?

Render lo que quiere a nivel de middleware:

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

Escribir común common.jade:

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

luego escribir archivo que se extiende common.jade:

extends common.jade 
block sublevel 
    h2 Some things are here