2012-08-03 81 views
15

我快速的應用程序使用EJS,和我的看法目錄如下:使用插包括

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

我想有條件基於加載home.ejs我layout.ejs視圖在我的routes/index.js中的一個名爲contents的本地變量上。這個文件看起來是這樣的:

/* 
* GET home page. 
*/ 

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

理想的情況下,我可以簡單的寫(在layout.ejs):

<% include '/contents' + contents %> 

在結尾的「內容」是含有對身體的相對路徑的局部變量文本加載。

但是,可惜的是,看起來EJS總是按照字面上的include指令解釋文本,並且沒有機會發生任何插值魔術。

我也試過無濟於事:

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

是否有人在有條件包括基於在路線傳遞一個變量視圖創造性的解決方案?

+0

有沒有解決這個問題? – 2012-09-30 15:16:20

+3

+1,如果它不能動態的話,包括什麼?我不知道如何使用它。 – 2012-11-04 18:37:03

回答

4

我認爲這是沒有辦法的動態包括EJS做這樣的。它可能會打破業務邏輯和視圖的分離。 解決方案可以是渲染控制器中的子模板,並將其內容傳遞給佈局。

對於控制器使用這樣的渲染子模板:

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

在EJS的2版本中,include功能是否良好。有了它,include就會在運行時插入,所以變量可以用作路徑名。

在這種情況下,該解決方案可以是:

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

該功能也可以有另一種說法,如果必要:

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

路徑名具有可相對於該調用該函數的模板。

0

在渲染功能,您可以包括fs.readFileSync__dirname

渲染選擇你的頁面這樣

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

然後你就可以在你的頁面.ejs像這樣使用它。這仍然在服務器端。

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

可以打印在這樣客戶端HTML數據。

<%- JSON.stringify(products)%> 

注:使用此方法意味着你必須在腳本的頂部某處包括fs

var fs = require('fs')