带有Express的把手:不同页面的不同html标题

带有Express的把手:不同页面的不同html标题,express,handlebars.js,Express,Handlebars.js,我在一个Express Node.js应用程序中使用把手。My layout.html文件包含一个部分。如何使部分针对不同的页面而有所不同?(例如,我可以在一个页面中引用JavaScript文件,并更改每个页面的。) layout.html如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src='/public/ajsfile.js'&g

我在一个Express Node.js应用程序中使用把手。My layout.html文件包含一个
部分。如何使
部分针对不同的页面而有所不同?(例如,我可以在一个页面中引用JavaScript文件,并更改每个页面的
。)

layout.html如下所示:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script src='/public/ajsfile.js'></script>
    <link type='text/css' href="/public/style.css" rel="stylesheet">
  </head>
  <body>
    {{{body}}}
  </body>
</html>

{{{body}}}

(我想象着用类似于上面的
{{{{body}}}
的东西来改变
的内容,但是用
{{{head}}}

这是一个很大的问题,在我看来,这是Express视图模型中的一个明显弱点。幸运的是,有一个解决方案:使用把手块助手。以下是我用于此目的的助手:

帮助程序:{
部分:功能(名称、选项){
如果(!this.\u sections)this.\u sections={};
this._sections[name]=options.fn(this);
返回null;
}
}
然后,在布局中,可以执行以下操作:


{{{{{u sections.head}}}
{{{body}}}
在你看来:

{{{#节“头”}
{{/section}
身体废话
这将进入页面正文


您可以执行以下操作:

布局图.hbs 结果:

MyApp

也许,您可以使用section helper的以下实现:

您只需安装并启用它:

纱线添加快速把手部分#或npm

const expressHandlebarsSections = require('express-handlebars-sections');

app.engine('handlebars', expressHandlebars({
    section: expressHandlebarsSections()
}));
希望能有帮助


Younes

我知道这是一个老问题,但我想指出一个明确的替代方案来解决你的问题(我不完全清楚为什么这么多年来没有其他人谈论这个问题)。当你提出在{{{{{{head}}}中放置东西时,你实际上已经找到了你想要的答案,就像你在{{{{body}}中所做的那样,但我想你需要帮助理解如何使它工作

这一页上的大多数答案似乎都是针对节点“部分”的,因为您谈到了要更改的布局文件中包含的HTML的不同部分。每个人在这篇文章中谈论的“部分”似乎是一种技术,尽管我可能弄错了,它起源于微软的Razor模板引擎。更多信息:

无论如何,部分可以解决你的问题,理论上“部分”也可以(尽管它实际上可能不是最好的选择)。有关Partials的更多信息:

但是,您只需要寻找一种方法来更改Handlebar中模板布局的HTML标记内容,并且假设我们讨论的是HTML头标记,那么您所需要做的就是将模板布局HTML头标记中的内容替换为其中一个(我使用3个括号,因为它似乎包含HTML,您不希望它转义):


现在,当您加载页面时,“我做到了!”将是您希望它显示的地方。

谢谢;好的解决方案!(尽管您可能想在视图的开头键入{{{section'head}}--缺少“}”)。是的,唐:只需修改帮助程序以附加到{u sections[name]而不是指定给此处,如果(!this.\u sections)我最终使用的是这个。_sections={};if(!this。_sections[name])这个。_sections[name]=[];这个。_sections[name].push(options.fn(this));Handlebar上下文对象非常感谢,一直在寻找这个!与NodeEmailer express Handlebar Package配合使用,因为我们希望将头部内容从hbs页面传递到版面,而不是从nodejs路线传递。
router.get('/', function (req, res, next) {
    res.render('index', { title: 'MyApp', css: ['style.css', 'custom.css'] });
});
<head>
    <title>MyApp</title>
    <link rel="stylesheet" href="/css/style.css" />
    <link rel="stylesheet" href="/css/custom.css" />
</head>
const expressHandlebarsSections = require('express-handlebars-sections');

app.engine('handlebars', expressHandlebars({
    section: expressHandlebarsSections()
}));
<head> 
{{{headContent}}}
</head>
router.get('/', function (req, res) {
res.render( 'index', { headContent:'I DID IT!' });
});