2012-08-03 9 views
15

マイExpressのアプリがEJSを使用している含まれており、私の意見ディレクトリは次のようになります。使用する補間は

./views 
    ./contents 
    home.ejs 
    ./includes 
    header.ejs 
    footer.ejs 
    layout.ejs 

は私layout.ejsビューで条件付きベースhome.ejsをロードしようとしています私のルート/ index.jsにあるcontentsという名前のローカル変数にあります。

/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: 'Home', contents: 'home.ejs' }); 
}; 

理想的には、私は単に(layout.ejsに)書くことができます::

末尾「内容」は、本体に相対パスが含まれているローカル変数である
<% include '/contents' + contents %> 

そのファイルは次のようになります読み込むテキスト。

しかし、まあ、EJSは常にincludeという指示文に続くテキストを解釈し、補間マジックが起こる機会はないようです。

私も無駄にしようとしました:

<% function yieldContent(contents){ %> 
    <% var contentPath = 'contents/' + contents; %> 
    <% include contentPath %> 
<% }; %> 
<% loadContent(); %> 

誰もが条件付きルートに渡された変数に基づいてビューを含むための創造的な解決策を持っていますか?

+0

これまでに解決されましたか? –

+3

+1、ダイナミックではない場合、includeのポイントは何ですか?私はそれを使用する方法を取得しません。 –

答えて

4

私はEJSにこのようなダイナミックなインクルードを行う方法はないと思います。ビジネスロジックとビューの分離を破る可能性があります。 解決策は、コントローラー内のサブテンプレートをレンダリングし、その内容をレイアウトに渡すことです。コントローラの使用中にこのような何かサブテンプレートをレンダリングするための

var ejs = require('ejs'), 
, fs = require('fs') 
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8")) 
1

include機能はよくそれをしません。これを使用すると、includeが実行時に挿入されるので、変数をパス名として使用できます。この場合

、溶液であってもよい:パス名は、関数を呼び出すテンプレートに対してなければなら

<%- include('mypathname', {foo:"bar"}) %> 

:必要に応じて

<%- include('contents/' + contents) %> 

機能は、他の引数を持つことができ。

0

レンダリング機能では、fs.readFileSync__dirnameを含めることができます。

この

res.render('pages/'+req.file,{file_get_contents:fs.readFileSync,__dirname:__dirname}); 

その後、あなたはこのようなあなたの.ejsページでそれを使用することができますのようなオプションを使ってページをレンダリングします。これはサーバー側に残ります。

<% var products=JSON.parse(file_get_contents(__dirname+'/web/data/products.json','utf8')) %> 

次のようなクライアントのHTML上のデータを印刷することができます。

<%- JSON.stringify(products)%> 

注:このメソッドを使用して、あなたのスクリプトの先頭にどこかfsが含まれていることを意味します。

var fs = require('fs') 
関連する問題