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」を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.
于 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 に答える