2012-06-14 9 views
10

条件に応じて、翡翠ページを異なるレイアウトに拡張したいと考えています。だから私のコードは次のようになります:nodejs jade条件付き延長

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

これはうまくいきません。条件に関係なく、最後に定義された拡張だけが尊重されるように見えます。私はまた、

(...、ダイナミックヘルパー関数を表現VAR、地元のVARなどとして設定)など

extends myLayoutNameVariable 

として、動的TEMPLATENAMEを定義しようとした、さまざまな方法でmyLayoutNameVariableを設定し、他はあります条件付きレイアウトのためのソリューション、または誰かが私が何を間違っているか教えてもらえますか?

if myConditionVariable 
    p test 

乾杯、サイモン

+0

もし ' - myConditionVariable'なら、' if'の前にマイナスがありますか? ( 'else'ブランチと同じです。)また、' append block'や何かを意味するでしょう。 – elmigranto

答えて

7

これはまだgithub上の開いている問題のようです。

+0

ヒントありがとう!レイアウトとインクルードは実行時ではなくコンパイル時に解決されるため、インクルードの場合も同様です。 – cmonsqpr

0

は、あなたのような何かを行うことができますか?

もしそうでなければ、そのビューを表示するように指示するときにmyConditionVariableを正しく渡しますか?このため、短い例:

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

彼は正しく渡しています。そうでなければ、 'myConditionVariableが定義されていません 'というエラーが発生します。 – elmigranto

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」で

(あなたがからを延長するテンプレート)、私はこれを行う:私は完全なlayout.jadeの他の要素を取り除かれている

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

(たぶん)明快さ。

最後に、layout.jadeを変更せずにそのまま使用できる通常のビュー(このjadeテンプレートには両方のケースが含まれています)。

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

これはパフォーマンスにまったく影響しますか?私が上にリンクされたgithubの問題を見たとき、TJがExpressがページをキャッシュしないと言いました。死んでから古い質問を起こして申し訳ありません。 – mshindal

+1

@mshindal - 私はあなたの質問に答える方法がわかりません、これには本当に複数の部分があります:1)JADEのコンパイルは以前と同じように起こります。 2)キャッシュがどのように構成されているかによって、ETagを使用している場合は、このヘッダーをエタグ生成に使用する必要がありますが、正直なところ、この解決策はキャッシュの懸念とは正反対です。だから私の答えは "いいえ、それはパフォーマンスに影響しません" –

+0

ちょうどあなたが知っている、expressはあなたの 'x-requested-with'ヘッダを調べる' req.xhr'を公開します;) – Chev

3

私はそれが手遅れではありません願っていますが、私はこの問題に出くわしましたし、私は回避策を考え出したと思う:

  1. はconditionaly両方のレイアウトが含まれlayout.jadeを行います

    layout.jade: 
    
    if conditionalVariable 
        include firstLayout.jade 
    else 
        include otherLayout 
    
  2. layout.jadeを拡張し、コントローラにconditionalVariableを定義してください(true/false):

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

+0

私はfirstLayoutを拡張しようとしましたが、機能しませんでした。 –