Pug从模板内的另一个文件调用js函数

Ili*_*daš 6 javascript templates pug

我差不多四个小时都解决不了这个问题,我找不到任何有用的文档来解决这类问题.这是问题,我正在使用pug/jade模板,我想在pug模板中调用函数来转换一些数据这是主模板:

 /** main template */
section
  each pet in pets
    .pet
      .photo-column
        img(src= pet.photo)
      .info-column  
        h2= pet.name 
        span.species= (pet.species)
        p Age: #{calculateAge(pet.birthYear)} //here I need to call calculateAge function
        if pet.favFoods
          h4.headline-bar Favorite Foods
          ul.favorite-foods
            each favFood in pet.favFoods
              li!= favFood
/** end main template **/
Run Code Online (Sandbox Code Playgroud)

这是外部功能:

/** calculateAge.js **/

 module.exports = function(birthYear) {
   var age = new Date().getFullYear() - birthYear;

   if (age > 0) {
     return age + " years old";
   } else {
     return "Less than a year old";
   }
 };
/** end calculateAge.js **/
Run Code Online (Sandbox Code Playgroud)

为实现这一目标,我采取了哪些措施?

Moh*_*waj 7

可能有更好的方法来处理这个问题,但我通常通过导入外部模块然后将其作为模板上下文对象的一部分传递来实现。这意味着呈现模板的代码应该是这样的:

const calculateAge = require("calculateAge"); // change path accordingly

router.get("/main", function(){
  let pageInfo = {};
  pageInfo.title = "Demo";
  pageInfo.calculateAge = calculateAge;
  res.render("main", pageInfo);
});
Run Code Online (Sandbox Code Playgroud)

现在,您可以calculateAge在模板中访问。如果这个模块在大多数模板中被大量使用,那么你应该将它作为res.localsor 的一部分传递,app.locals以便它可用于所有模板,而无需为每个路径请求附加它。


Pad*_*ddy 0

就像在原始 HTML 中一样,如果你希望 JS 在特定部分执行,你需要一个 script 标签来包含你想要使用的 js。

 span.species= (pet.species)
 p Age:
     .script 
         calculateAge(pet.birthYear) 
 if pet.favFoods
Run Code Online (Sandbox Code Playgroud)