Node.js Jade条件扩展

10

我想根据条件使我的Jade页面扩展不同的布局。所以我的代码看起来像这样:

if myConditionVariable
  extends layout1
else
  extends layout2  
block content
  p here goes my content!

现在这个方法无法正常工作。似乎只有最后一个定义的扩展会被应用,而不管条件是什么。我也尝试了动态定义模板名称的方式,例如:

extends myLayoutNameVariable

如何以不同的方式设置myLayoutNameVariable(例如表达式动态辅助函数、将其设置为变量、局部变量等...)

是否有其他的有条件布局解决方案,或者有人可以告诉我我做错了什么?

谢谢,西蒙


你是不是指的是 - if myConditionVariable — 看到 if 前面的减号了吗?(else 分支也一样。)另外,你可能是想说 append block 或者其他什么。 - Aleksei Zabrodskii
4个回答

11

因此,处理这个问题的一种稍微不那么侵入式的方法是改变布局本身。

我添加了一些中间件,其余的就顺畅了。

app.use(function(req, res, next){
    res.locals.isAjax = req.headers['x-requested-with'] && 
        req.headers['x-requested-with'] === 'XMLHttpRequest';
    next();
});
现在这个设置已经完成,"isAjax" 可用于jade。在我的 "layout.jade"(你将从中扩展的模板)中,我这样做:
- if(!isAjax)
  doctype 5
    html
      head
      body
        block content
        block scripts
- else
  block content
  block scripts

为了使内容更加清晰,我已经删除了完整layout.jade中的其他元素。

最后,我的正常视图不需要修改即可扩展layout.jade(此jade模板包括这两种情况)。

extends layout.jade
  .container.
     This is text will be wrapped for a non-ajax request, 
     but not for an ajax request.

这会影响性能吗?当我查看上面链接的 github 问题时,似乎 TJ 说 Express 不会缓存页面。很抱歉让一个老问题重见天日。 - mshindal
1
@mshindal - 我不确定如何回答你的问题,这里实际上有多个部分:1)JADE编译与以前相同,因此更多的模板代码,但影响不是很大。2)取决于缓存配置方式,如果使用ETags,则需要在生成ETag时考虑此标头,但老实说,我认为此解决方案与缓存问题无关。所以..我的答案是“不,它不会影响性能”。 - Andrew Theken
只是让你知道,Express暴露了req.xhr,它可以为您检查x-requested-with头部。;) - Chev
1
好的,这就是@chev!--甚至更容易。 - Andrew Theken

8
这似乎是一个仍然存在于 Github 上的问题。

谢谢提示!显然,对于包含文件也是如此,因为布局和包含文件在编译时而非运行时解析。 - cmonsqpr

6

希望还不算太晚,我遇到了这个问题并且想出了一个解决方法:

  1. Make a layout.jade that conditionaly includes both layouts:

    layout.jade:
    
    if conditionalVariable
        include firstLayout.jade
    else
        include otherLayout
    
  2. In your view, extend layout.jade, and define conditionalVariable in the controller (true/false):

    view.jade:
    
    extends layout
    
    block content
        p here goes my content!
    
  3. Disco!


关于继承,我尝试了继承firstLayout但它没有起作用。 - Ajay Patel

0

你能做类似这样的事情吗:

if myConditionVariable
  p test

?

如果没有,你在告诉视图渲染时是否正确地传递了myConditionVariable?以下是一个简短的示例:

app.get "/", (req, res) ->
  res.render "index",
    myConditionVariable: true

他正确地传递了它。如果没有,就会出现错误,显示“未定义myConditionVariable”。 - Aleksei Zabrodskii

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