2014-01-10 8 views
21

グローバルヘッダーが2か所で使用されていますが、テンプレートのレンダリング時に渡すことができる変数でその位置を定義しようとしていました。変数をEJSに渡します。

var headerLocation = 'some/location/header.ejs'; 
res.render(viewDir + '/index', { 
     header: headerLocation 
    }); 

とテンプレートファイルに:のような

何か

<% include header %> 

ヘッダレンダリングで渡された値です。

それは可能ではないようですが、多分私は何かを逃したので、ここで尋ねると思いました。

EDIT:これは要約することなく、以下の回答のコメントに記載されている

が、これはEJSのバージョン2で利用可能になりました。

はこちらを参照してください:ここhttps://github.com/mde/ejs#includes および関連の議論:https://github.com/tj/ejs/issues/93古い質問は、他人のためにそれを答えるにもかかわらず

答えて

6

この機能が追加されました:それはパスでない場合(ファイルが見つかりません)、変数名として評価されます。 https://github.com/visionmedia/ejs/pull/156

+4

感謝。私は実際にこの質問を投稿した後、すぐにhttps://github.com/visionmedia/ejs/issues/93に出くわしました。所定の場所にプルリクエストがありますが、まだnpmにリリースされていないようです。うまくいけばそれはすぐに受け入れられ、解放されるでしょう。私はこの答えを正しいものとしてマークします。それは、ここに着陸する可能性のある他の人を誤解させないように起こります。興味深い注釈は、何らかの理由で、Windowsのみで、ノードグローバルオブジェクトを使用することでこれに対応します。したがって、<%include global.somepath%>は何とか動作します。 MacでもLinuxでもはない。奇妙なもの。 –

+1

buf + = "'+(function(){include +"})()+' ";この行でbug.push行を変更することを考えてください。 (.pushでエラーを引き起こす可能性があります) – Arthur

+0

私はそれを試して、varにパスを格納し、 'include'でvarを使用しようとしましたが、値の代わりにvar名を使用しようとします。 EJS '1.0.0' – Vadorequest

4

githubのドキュメントによると、EJSにはブロックの概念はなく、コンパイル時にのみインクルードされているようです。コンパイル時には、場所をハードコードする必要があります。

だからがいくつかのフラグを渡してやってチェックしている場合、ヘッダやHTMLなどのヘッダを解析し、すべてのテンプレートに渡して残っている...

18

ここには動的なインクルードを実現できるデモコードがいくつかあります。

ビュー

<div flex class="main-container"> 
    <%- include(page) %> 
</div> 

ルータ

router.get('/', function (req, res, next) { 
    res.render('pages/index', { 
     page: 'home' 
    }); 
});