10

我想让我的 Jade 页面根据条件扩展不同的布局。所以我的代码如下所示:

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

现在这不起作用。无论条件如何,似乎都只会尊重最后定义的扩展。我也尝试过动态定义模板名,比如

extends myLayoutNameVariable

并以不同的方式设置 myLayoutNameVariable(表达动态辅助函数,将其设置为 var、local var 等...)

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

干杯,西蒙

4

4 回答 4

11

因此,一种稍微不那么侵入性的处理方法是更改​​布局本身。

我添加了一些中间件,其余的流程......

app.use(function(req, res, next){
    res.locals.isAjax = req.headers['x-requested-with'] && 
        req.headers['x-requested-with'] === 'XMLHttpRequest';
    next();
});

既然设置好了,“isAjax”就可以用于玉了。

在我的“layout.jade”(您将从中扩展的模板中,我这样做:

- if(!isAjax)
  doctype 5
    html
      head
      body
        block content
        block scripts
- else
  block content
  block scripts

为了(希望)清晰起见,我已经删除了完整 layout.jade 的其他元素。

最后,我扩展 layout.jade 的普通视图无需修改即可工作(此翡翠模板包括这两种情况)。

extends layout.jade
  .container.
     This is text will be wrapped for a non-ajax request, 
     but not for an ajax request.
于 2013-08-08T01:24:05.600 回答
8

这似乎是一个在github上仍然存在的问题。

于 2012-06-14T22:12:45.947 回答
6

我希望现在还不算晚,但我遇到了这个问题,我想我想出了一个解决方法:

  1. 制作一个 layout.jade 有条件地包含两种布局:

    layout.jade:
    
    if conditionalVariable
        include firstLayout.jade
    else
        include otherLayout
    
  2. 在您的视图中,在控制器 ( / ) 中扩展layout.jade和定义:conditionalVariabletruefalse

    view.jade:
    
    extends layout
    
    block content
        p here goes my content!
    
  3. 迪斯科

于 2014-01-20T17:00:33.377 回答
0

你可以做类似的事情:

if myConditionVariable
  p test

?

如果不是,myConditionVariable当您告诉渲染该视图时您是否正确传递?一个简短的例子:

app.get "/", (req, res) ->
  res.render "index",
    myConditionVariable: true
于 2012-06-14T22:02:11.403 回答