web-dev-qa-db-ja.com

Jadeインクルードで変数を使用する

私は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}

無駄に。

51
Spencer Carnage

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 }
42
freakish

これも機能します:

//controller
var jade = require('jade');
res.render('show', {templateRender: jade.renderFile});


//template
!= templateRender('my/path/'+dynamic+'.jade', options)

これにより、おそらく 'view cache' 設定を使用することで期待されるパフォーマンスは向上しません(NODE_ENV === 'production'でデフォルトでオンになります)。または、アプリを中断します(たとえば、新しいコードの展開中にファイルがハードドライブで利用できない場合)。また、テンプレートをコンパイルできないため、クライアント側または同型アプリでこのトリックを使用しようとしても機能しません。

19
antpaw

このページは同じ質問でグーグルですが、異なるコンテキストで見つけたので、後世のためにここに解決策を読んでください(回避策):

私はインクルードを変​​数から引き出されたより多くのコンテキストで囲みたかった。 (簡略化):

- 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の一部は動的です。

7
Frijol

ヒスイの継承を使用しないのはなぜですか?

ミドルウェアレベルで必要なものをレンダリングします。

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
1
user2956171

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ドキュメント をご覧ください。

0
robertunyx