2013-08-29 29 views
3

我正在使用Express和EJS來提供頁面。我爲UI使用Bootstrap,特別是導航欄。在使用快遞時在EJS視圖中查找當前網址

我想添加一個'active'類到當前頁面的<li>項目,以顯示當前頁面。但是,我找不到如何從呈現頁面的EJS代碼中獲取URL。

我發現了兩個解決方法:我使用了包括傳遞頁面名稱作爲參數的路由res.render('myview', {pageName: 'myView'}); - 這是不可伸縮的,可能會導致問題。

另一種方式是在客戶端使用jQuery將'active'類添加到頁面準備好的項目上 - 但這意味着在每個視圖中包含這段腳本+一些無用的客戶端循環。

之前使用過幾種服務器端渲染語言,我覺得我錯過了一些東西。在線EJS文檔並不是那麼好。

有什麼方法可以從EJS代碼中找到我當前的路徑/ url?

更新: 我採取了前兩個建議,並將視圖名稱作爲參數傳遞給視圖。我真的很喜歡@tandrewnichols的想法自動計算它,但最終,它只是複製粘貼字符串更容易:)

回答

1

在幾乎每個節點/表達模板語言我已經使用(ejs,獼猴桃,swig,玉),答案是否定的。我總是設置一個名爲「active」的變量,然後檢查它。正如你所說,這不是一個好的答案,但我不知道可擴展性是個問題。如果每個url都呈現它自己的視圖(或者即使您有一個共同的視圖渲染處理程序),也不應該那麼難說像req.active = "Somepage"之類的東西。另一種可能性是添加中間件,根據路線爲您完成。喜歡的東西

app.use(function(req, res, next){ 
    req.active = req.path.split('/')[1] // [0] will be empty since routes start with '/' 
    next(); 
}); 

然後你只需確保有相應的導航組件使用唯一路徑的任何路由,像

app.get('/students', ....) 
app.get('/classes', ....) 
app.get('/teachers', ....) 
// etc. 

編輯:在回答你的評論,我總是拋出我所有的觀點的東西進入在req裏面有一個對象鍵,通常我用我使用的任何模板命名鍵。所以我可能會實際使用上面的例子來設置req.ejs.active,然後做

res.render('myview', req.ejs); 

這種方法使得它更以不同的邏輯更容易出成多箇中間件功能,而不是有一個巨大的匿名對象傳遞給res.render。

+1

而你如何從EJS獲得主動? –

14

據我所知,除非你在內部修改EJS,否則你不能做你所要求的。然而,不太麻煩的解決方案是在每個頁面調用上傳遞請求的URL屬性,而不是按照每個路由定義它。

app.get('/url', function (req, res) { 
    res.render('view', { 
    page: req.url, 
    nav: { 
     'Page 1': '/page1', 
     'Page 2': '/page2', 
     'Page 3': '/page3' 
    } 
    }); 
}); 

如果你只是想獲得的URL的第一部分和與之相匹配的,那麼你可以只調用split('/')req.url。然後,您可以在您的模板文件中放置一個循環來爲您的導航欄創建列表。

<% nav.forEach(function(title) { %> 
    <% if (nav[title] == page) { %> 
    <li class="active">This part of the navigation bar is active.</li> 
    <% } else { %> 
    <li>This part of the navigation bar is normal.</li> 
    <% } %> 
<% }) %> 
+1

比IMO接受的答案更好的解決方案。謝謝! – robabby