15

Express アプリは EJS を使用しており、views ディレクトリは次のようになっています。

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

contentsroutes/index.js で名前が付けられたローカル変数に基づいて、条件付きで layout.ejs ビューに home.ejs をロードしようとしています。そのファイルは次のようになります。

/*
 * GET home page.
 */

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

理想的には、(layout.ejs で) 単純に次のように記述できます。

<% include '/contents' + contents %>

末尾の「contents」は、ロードする本文テキストへの相対パスを含むローカル変数です。

しかし残念なことに、EJS はincludeディレクティブに続くテキストを常に文字どおりに解釈するようであり、補間魔法が起こる可能性はありません。

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

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

ルートで渡された変数に基づいて条件付きでビューを含めるための創造的なソリューションを持っている人はいますか?

4

4 に答える 4

4

この種の動的インクルードを EJS で行う方法はないと思います。ビジネス ロジックとビューの分離が崩れる可能性があります。解決策は、コントローラーでサブテンプレートをレンダリングし、そのコンテンツをレイアウトに渡すことです。

コントローラーでサブテンプレートをレンダリングするには、次のようなものを使用します。

var ejs = require('ejs'),
, fs = require('fs')
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8"))
于 2012-08-04T06:55:50.313 に答える
2

バージョン 2 の EJS では、このinclude機能はうまく機能します。これにより、実行時にインクルードが挿入されるため、変数をパス名として使用できます。

この場合、解決策は次のようになります。

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

関数は、必要に応じて別の引数を持つこともできます:

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

パス名は、関数を呼び出すテンプレートに対して相対的でなければなりません。

于 2015-06-21T21:07:20.123 に答える
0

現在、これは ejs に実装されていませんが、機能を提供するこのディスカッションとプル リクエストがあります。

https://github.com/visionmedia/ejs/issues/93

于 2014-05-30T08:52:04.633 に答える
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')
于 2017-07-11T01:48:59.140 に答える