Jade模板,包含文件中的变量作用域

9

我正在使用Jade(不用Express,只用于静态HTML模板)- 我理解它可以创建部分视图,这意味着作用域不是问题,但事实并非如此,我找不到任何参考资料。

master.jade

!!! 5
html
  block vars
  - var slug= 'home'
  head
    block pagetitle
      title Static HTML
    link(rel='stylesheet', href='css/styles.css')
  body(class= slug)
    .wrapper
      include includes/header

includes/header.jade

.header 
  ul
    li(class= slug)

我尝试过包括#{slug}在内的不同语法变体,但总是在includes/header.jade文件中出现“slug未定义”的错误 - 是否有可能实现这一点?

编辑:根据下面评论中Dave Weldon给出的答案,当包含在master.jade中时,该变量是可用的,但我的构建命令编译了所有jade文件,包括它们自己的includes,此时变量当然未定义。

1个回答

16
你可以通过像这样的mixin来实现这个功能:

master.jade

include includes/header

!!!
html
  block vars
  - var slug= 'home'
  head
    block pagetitle
      title Static HTML
    link(rel='stylesheet', href='css/styles.css')
  body(class= slug)
    .wrapper
      mixin header(slug)

includes/header.jade

mixin header(klass)
  .header
    ul
      li(class= klass)

编译后:

<!DOCTYPE html>
<html>
  <head>
    <title>Static HTML</title>
    <link rel="stylesheet" href="css/styles.css">
  </head>
  <body class="home">
    <div class="wrapper">
      <div class="header">
        <ul>
          <li class="home"></li>
        </ul>
      </div>
    </div>
  </body>
</html>

所以你的意思是说这个 include 对那个变量没有作用域?鉴于我的实际 includes/header.jade 文件的内容,我想避免使用 mixin——我的示例非常简化!但是如果你说我不能像这样继承变量,我想我别无选择。 - A Macdonald
实际上它运行得很好 :) 谢谢 - 肯定会更多地使用混入 - 没有我想象的那么糟糕 - 再次感谢 - A Macdonald
是的,我意识到我实际上没有回答你的问题。如果你只运行jade master.jade,那么你的原始代码就可以正常工作 - 如果你编译includes/header.jade,你会得到一个错误。个人而言,我非常喜欢使用mixin,并尽可能多地使用它们。我认为即使在这种情况下,它也是更优秀的解决方案,因为你可以指定mixin可以接受什么参数,而且jade不会抱怨如果你要求它编译包含文件。 - David Weldon
啊,原来如此!我的命令 jade -P jade --out html 当然会编译包括 includes 文件夹在内的 jade 文件夹中的所有文件……不过我还是更喜欢 mixin。 - A Macdonald
你可以使用"+"代替"mixin" :) - BotanMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接