2014-01-10 105 views
21

我在一些地方使用了一個全局標題,我試圖在渲染模板時可以傳遞的變量中定義它的位置。將變量傳遞給EJS包括

喜歡的東西:

var headerLocation = 'some/location/header.ejs'; 
res.render(viewDir + '/index', { 
     header: headerLocation 
    }); 

而且在模板文件:

<% include header %> 

頭是與渲染傳遞的價值。

這似乎不可能,但也許我錯過了一些東西,所以認爲我會問這裏。

編輯:

這在下面,但總結答案評論中提到,這是目前在EJS的2版本。

在這裏看到:https://github.com/mde/ejs#includes 及相關討論在這裏:https://github.com/tj/ejs/issues/93

回答

6

這個功能已經被添加:如果不是路徑(找不到文件),它被評估爲變量名稱。 https://github.com/visionmedia/ejs/pull/156

+4

感謝。在發佈這個問題後,我實際上很快遇到了https://github.com/visionmedia/ejs/issues/93。雖然有一個拉的請求,它似乎還沒有發佈到NPM。希望它會很快被接受和發佈。一旦發生這種情況,我會將這個答案標記爲正確的,以免誤導可能在這裏降落的其他人。有趣的是,無論出於何種原因,只有在Windows上,使用節點全局對象才能工作。所以<%include global.somepath%>以某種方式起作用。不過在Mac或Linux上。奇怪的一個。 –

+1

想想用這一行改變bug.push行(在新代碼中):buf + =「'+(function(){」+ include +「})()+'」; (可能導致.push出錯) – Arthur

+0

我剛試過,在var中存放一個路徑並試圖用'include'使用var,它仍然嘗試使用var名稱而不是值。 EJS'1.0.0' – Vadorequest

4

即使它的一個老問題,其回答爲別人着想。

根據github文檔,似乎EJS沒有塊的概念,只有編譯時包含。由於其編譯時間包括,您需要對位置進行硬編碼。

所以你留下了一些通過標誌和在首部檢查或分析標題爲html並將其傳遞給所有的模板做...

18

下面是一些可以實現動態包含的演示代碼。

查看

<div flex class="main-container"> 
    <%- include(page) %> 
</div> 

路由器

router.get('/', function (req, res, next) { 
    res.render('pages/index', { 
     page: 'home' 
    }); 
});