私はJadeとExpressで作業していますが、includeステートメントで変数を使用したいと思います。例えば:
app.js
app.get('/admin', function (req, res) {
var Admin = require('./routes/admin/app').Admin;
res.render(Admin.view, {
title: 'Admin',
page: 'admin'
});
});
layout.jade
- var templates = page + '/templates/'
include templates
これを行うと、エラーEBADF, Bad file descriptor 'templates.jade'
私も試しました
include #{templates}
無駄に。
AFAIK JADEはダイナミックインクルードをサポートしていません。私が提案するのは、テンプレートの外側に「含める」ことです。
app.js
app.get('/admin', function (req, res) {
var Admin = require('./routes/admin/app').Admin;
var page = 'admin';
var templates = page + '/templates/';
// render template and store the result in html variable
res.render(templates, function(err, html) {
res.render(Admin.view, {
title: 'Admin',
page: page,
html: html
});
});
});
layout.jade
|!{ html }
これも機能します:
//controller
var jade = require('jade');
res.render('show', {templateRender: jade.renderFile});
//template
!= templateRender('my/path/'+dynamic+'.jade', options)
これにより、おそらく 'view cache' 設定を使用することで期待されるパフォーマンスは向上しません(NODE_ENV === 'production'でデフォルトでオンになります)。または、アプリを中断します(たとえば、新しいコードの展開中にファイルがハードドライブで利用できない場合)。また、テンプレートをコンパイルできないため、クライアント側または同型アプリでこのトリックを使用しようとしても機能しません。
このページは同じ質問でグーグルですが、異なるコンテキストで見つけたので、後世のためにここに解決策を読んでください(回避策):
私はインクルードを変数から引き出されたより多くのコンテキストで囲みたかった。 (簡略化):
- var templates = page + '/templates/'
- var headid = page + 'head'
- var imgsrc = '/images/' + page
div(id=headid)
h1 #{page}
img(src=imgsrc)
div(id=page)
include templates
それが機能しないので(Jadeは、奇妙なことに指摘されているように、動的なインクルードをサポートしていません)、mixinとハイブリダイズしました:
(編集-以前の回避策よりも少しエレガント:)
mixin page1
include page1/templates
mixin page2
include page2/templates
...
- for (var i = 0; i < 3; i++)
- var page = 'page' + i
- var headid = page + 'head'
- var imgsrc = '/images/' + page
div(id=headid)
h1 #{page}
img(src=imgsrc)
div(id=page)
+page
私の前の答え:
mixin templates(page)
- var headid = page + 'head'
- var imgsrc = '/images/' + page
div(id=headid)
h1 #{page}
img(src=imgsrc)
+templates('page1')
#page1
include page1/templates/
+templates('page2')
#page2
include page2/templates/
...
これはエレガントではなく、この方法でいくつか以上のものを含める必要がある場合は機能しませんが、少なくともJadeの一部は動的です。
ヒスイの継承を使用しないのはなぜですか?
ミドルウェアレベルで必要なものをレンダリングします。
res.render('templates/' + template_name + '.jade')
一般的なcommon.jade
を書く:
h1 This is a page
.container
block sublevel
h2 Default content
次に、common.jade
を拡張するファイルを作成します。
extends common.jade
block sublevel
h2 Some things are here
2019年になり、Pug(以前のJade)ミックスインでの変数の使用が簡単になりました。
ミックスインを作成するとき、ミックスインに渡すことが期待される値ごとにパラメーターを与えることができます。ドット表記を使用して、ネストされた値にアクセスできます。
mixinFile.pug:
mixin myMixin(parameter1, parameter2, parameter3)
h2.MyHeading #{parameter1}
p.MyParagraph #{parameter2.myVariable}
.MyBox(id= parameter3.id)
index.pug:
include mixinFile
block content
+MyMixin(variable1, variable2, variable3)
詳しくは Mixinsの公式Pugドキュメント をご覧ください。