2014-01-06 149 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

是定义的函数早些时候需要一些参数安静。