web-dev-qa-db-ja.com

Express 4ハンドルバーはレイアウトなしでレンダリングされます

Express 4アプリで、レイアウトを使用せずにビューをレンダリングする方法はありますか?

プロジェクト内にlayout.hbsがあります。ファイルはどこにでも登録する必要なく使用されているようで、ほとんどのビューで問題ありませんが、単一のビューだけをレンダリングする必要がない場合はどうなりますか?

18
adrianvlupu

Express-handlebarsを使用していると想定すると、renderメソッドを呼び出すときに、ルート/コントローラーとは異なるレイアウトを指定できます。レイアウトを完全に取り除くには、レイアウトをfalseに設定します。

router.get('/', function(req, res) {
    res.render('home', {layout: false});
});

https://github.com/ericf/express-handlebars#layouts

43
Ryan

app.render()関数を使用してHTMLをレンダリングする場合。あなたは Rayanの答え で行くのが良いです。 Express documentation 自体に言及しているように、res.render()メソッドも内部でapp.render()メソッドを使用します。

const app = require('express')();
app.set('view engine', 'hbs');
/**
 * Render email template with data
 * 
 * @param {String} emailTemplate email template path
 * @param {Object} renderParams Render parameters
 * @return {Promise} rendered template
 */
async function renderEmail(emailTemplate, renderParams) {
 const renderParams = { layout: false, ...otherRenderParams };

 return await new Promise((resolve, reject) => {
   app.render(emailTemplate, renderParams, function (err, html) {
       if (err) return reject(err);
       return resolve(html);
   });
 });
}
0

レンダリングするデータがある場合、layoutはそのようなデータの追加のプロパティにすぎないことを明確にする必要があります

var data = {
    layout: false, 
    var1: var1,
    var2: var2
};

res.render('home', data); 

レイアウトを指定したくない場合は、layout: falseと指定する必要があります。そうしないと、アプリがクラッシュします。必要に応じて、次のように構成できます。

app.get('/', (req, res, next) => {
    res.render('shop', { title: 'My Shop', layout: false })
});

express-handlebarsのより多くの構成について

0
Anand Raja