2014-01-06 150 views
13

我是新來的NodeJS並試圖創建HTML內容myfile.jade玉文件: 下面是該文件的內容:javascript函數執行

extends layout 
block content 
    script 
    function capitalize(s) { 
     console.log("Testing js exec"); 
     return s.charAt(0).toUpperCase() + s.slice(1); 
    }; 
    table 
    - each item in list 
     tr 
     td 
      a(href="/collection/#{item.name}") #{capitalize(itemName)} 

然而,當運行它拋出以下錯誤:

Error: mweb/views/collections.jade:8 
    6| script 
    7|  function capitalize(s) { 
    > 8|  console.log("Testing js exec"); 
    9|  return s.charAt(0).toUpperCase() + s.slice(1); 
    10|  }; 

unexpected text ;

如果我刪除的console.log,它拋出的錯誤說:

TypeError: mweb/views/collections.jade:18 
    > 18|    a(href="/collection/#{item.name}") #{capitalize(itemName)} 

據我瞭解,在玉石編譯過程中,大寫字母被調用,由於script標籤也被編譯到html中,所以函數不可用。對於我來說,在 a)服務器端或 b)客戶端上評估此呼叫的最佳方式是什麼?

THX

回答

17

你需要在玉的範圍定義函數,而不是在JS你產生:

block content 
    - function capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1); }; 
    table 
    - var list = ['one', 'two'] 
    - var itemName = 'test test' 
    - each item in list 
     tr 
     td 
      a(href="/collection") #{capitalize(itemName)} 

,但它可能會更好有它的模板之外,並通過參考幫手對象

+0

謝謝。這樣可行。你介意提供關於如何使用助手的參考嗎? – Kiran

+0

我也對這些幫助對象感興趣.. – caiuspb

+0

沒有特別的幫手庫。我將用戶提供的函數稱爲「助手」。當你渲染模板時,你傳遞你的對象作爲輸入,並且可以將數據與數據一起傳遞給你的幫助器/實用程序函數 –

7

我意識到這是真的老了,但是當你在玉聲明一個功能,你需要做的

script. 

script 

期間使差異,將使玉拿起它的其​​實是一段代碼,而不是HTML。

4

通過這個#{capitalize(itemName)}您試圖調用從控制器(後端)傳遞給模板的函數。

例如(/routes/index.js)

res.render('index', { title: 'Express test', fs : { echo : lang} }); 

雖然index.jade

a(href='/register') #{fs.echo('xxx')} 

其中

lang

是定義的函數早些時候需要一些參數安靜。