jade模板里面的javascript函数执行

时间:2014-01-06 00:02:46

标签: javascript node.js express pug

我是nodejs的新手,并尝试为html内容myfile.jade创建一个jade文件: 以下是文件的内容:

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)}

据我所知,在jade编译期间调用了大写,并且该函数不可用,因为脚本标记也被编译到html中。评估此呼叫的最佳方式是什么? a)服务器端或 b)客户方?

THX

3 个答案:

答案 0 :(得分:19)

你需要在jade的范围内定义函数,而不是在你生成的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)}

但最好将它放在模板之外并传递对辅助对象的引用

答案 1 :(得分:7)

我意识到这很老了,但是当你在jade中声明一个函数时,你需要做

script.

不是

script

这个时期会产生影响,并且允许jade接受它实际上是一段代码,而不是HTML。

答案 2 :(得分:4)

通过此#{capitalize(itemName)},您尝试调用从控制器(后端)传递给模板的函数。

例如(/ routes / index.js)

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

index.jade

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

其中

  

是前面定义的函数,它带有一些参数。