2012-08-25 44 views
2

基本上我想建立一個網站廣泛導航欄包含鏈接在express.js在局部變量指定在express.js

所以我建立我的鏈接列表中的每個請求,設置全局變量res.local我想在頁面上包括:

class NavigationLink 
    constructor: (@title,@url) -> 

app.use (req,res,next) -> 
    res.locals.navigationLinks = [ 
    new NavigationLink "About", "/about" 
    new NavigationLink "Projects", "/projects" 
    new NavigationLink "Skills", "/skills" 
    new NavigationLink "Contact", "/contact" 
    ] 
    next() 

然後如果我打的主頁:

app.get '/', (req,res) -> 
    res.render('about') 

玉試圖使這個佈局文件,這是通過導航應該循環鏈接陣列和渲染每一個:

!!! 5 
html 
include header 
body 
    .container 
     .row 
      .span3 
       ul.nav.nav-tabs.nav-stacked 
        for navigationLink in navigationLinks 
         include navigationLink 
      .span9 
       block content 

但是我得到一個參考錯誤「navigationLinks沒有定義」,我認爲是指是指當地人沒有得到通過。會喜歡關於如何解決問題的建議,或者更適合這種事情的其他設計範例(在網站的每個頁面上動態構建鏈接)。謝謝!

+1

我猜你的'app.use'在'app.router'下面。 –

回答

3

Jonathan Ong是正確的。您的上面的代碼應該在默認中間件訂單中工作,該訂單將在app.router中間件之前運行所有app.use中間件。因此,我同意你的代碼中的其他地方可能有一行app.use app.router,它位於代碼片段中的app.use之前。

+0

這是不正確的。他們都是模板本地人。 –

+0

好,所以我已經驗證了我之前的代碼工作,當我把它放在app.router。彼得的原始代碼使用app.locals也可以。公約明智,哪種方式更好? App.locals或像上面那樣設置res.locals? – Msencenb

+1

'res.locals'對於特定於此請求的數據更有意義,例如'/ weather'路由中的'res.locals.currentTemp'。 'app.locals'對於大多數或所有視圖都需要的東西更好。就你而言,如果大多數視圖使用相同的佈局,則使用'app.locals.navigationLinks'似乎是合適的 –