2012-08-03 21 views
15

Mi expreso aplicación está utilizando EJS, y mi directorio de puntos de vista se ve así:Utilizando la interpolación dentro de Node.js EJS incluye

./views 
    ./contents 
    home.ejs 
    ./includes 
    header.ejs 
    footer.ejs 
    layout.ejs 

estoy tratando de cargar home.ejs en mi opinión layout.ejs basado condicionalmente en una variable local llamada contents en mis rutas/index.js. Ese archivo tiene el siguiente aspecto:

/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: 'Home', contents: 'home.ejs' }); 
}; 

Lo ideal sería que simplemente podría escribir (en layout.ejs):

<% include '/contents' + contents %> 

donde el arrastre "contenido" es la variable local que contiene la ruta con relación al cuerpo texto para cargar

Pero, por desgracia, parece que EJS siempre interpreta el texto siguiendo una directiva include literalmente, y no hay posibilidad de que ocurra ninguna magia de interpolación.

También he intentado en vano:

<% function yieldContent(contents){ %> 
    <% var contentPath = 'contents/' + contents; %> 
    <% include contentPath %> 
<% }; %> 
<% loadContent(); %> 

¿Alguien tiene una solución creativa para incluir condicionalmente una vista basada en una variable pasada en rutas?

+0

¿Alguna vez ha resuelto esto? –

+3

+1, ¿qué sentido tiene incluir si no puede ser dinámico? No entiendo cómo usarlo. –

Respuesta

4

Creo que no hay forma de que este tipo de dinámica incluya en EJS. Podría romper la separación de la lógica y la visión empresarial. La solución puede ser renderizar la subtabla en el controlador y pasar su contenido al diseño.

para la representación del subtemplate en el uso del controlador algo como esto:

var ejs = require('ejs'), 
, fs = require('fs') 
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8")) 
1

En la versión 2 de EJS, la función include lo hace bien. Con él, los includes se insertan en tiempo de ejecución para que las variables se puedan usar como nombres de ruta.

En este caso, la solución puede ser:

<%- include('contents/' + contents) %> 

La función también puede tener otro argumento si es necesario:

<%- include('mypathname', {foo:"bar"}) %> 

La ruta tiene que ser relativa a la plantilla, que llama a la función .

0

en su función de procesamiento puede incluir fs.readFileSync y __dirname.

hacer que su página con opciones como esto

res.render('pages/'+req.file,{file_get_contents:fs.readFileSync,__dirname:__dirname}); 

A continuación, puede utilizarlo en su página .ejs como este. Esto permanece en el lado del servidor.

<% var products=JSON.parse(file_get_contents(__dirname+'/web/data/products.json','utf8')) %> 

Puede imprimir los datos de cliente HTML como este.

<%- JSON.stringify(products)%> 

Nota: El uso de este método significa que tiene fs incluido en algún lugar en la parte superior de su script.

var fs = require('fs')