web-dev-qa-db-ja.com

変数をEJSインクルードに渡す

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

何かのようなもの:

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

そしてテンプレートファイルで:

<% include header %>

headerは、レンダリングで渡される値です。

それは可能ではないようですが、おそらく何かを逃したので、ここで尋ねます。

編集:

これは、以下の回答のコメントで言及されていますが、要約すると、これはEJSのバージョン2で使用できるようになりました。

ここを参照してください: https://github.com/mde/ejs#includes そして、関連するここの議論: https://github.com/tj/ejs/issues/9

23
Ruairi O'Brien

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

6
pr.nizar

動的なインクルードを実現できるいくつかのデモコードを次に示します。

ビュー

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

ルーター

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

古い質問ですが、他の人のために答えます。

Githubのドキュメントによると、EJSにはブロックの概念がなく、コンパイル時のインクルードしかありません。コンパイル時にインクルードするため、場所をハードコーディングする必要があります。

したがって、いくつかのフラグを渡し、ヘッダーをチェックインするか、ヘッダーをhtmlとして解析してすべてのテンプレートに渡すかを行う必要があります...

4
Murukesh

古い主題ですが、誰かを助けるかもしれません。

EJSの素晴らしい点は、それが単なるJavaScriptであることです。したがって、次のようなものが機能するはずです。

<%
const fs = require('fs');
const content = fs.readFileSync(partial);
%>
<%- content %>

それが役に立てば幸い。

0
Josuah Aron