学习 Handlebars 和 Express 我正在尝试学习一种发送对象的方法,而不必总是在渲染中构建。例如,如果我有:
const details = {
version: process.env.npm_package_version,
author: 'foobar'
}
我可以将其以部分形式发送到我的 footer.hbs:
app.get('/', (req, res) => {
res.render('index', {
details
})
})
但正在寻找一种将其发送到模板文件而不总是在渲染中的方法,我在有关 block helpers 的文档中读到过并尝试过:
// Define paths for Express config
const publicDir = path.join(__dirname, '../public')
const viewsPath = path.join(__dirname, '../templates/views')
const partialsPath = path.join(__dirname, '../templates/partials')
// Setup hbs engine and views location
app.set('view engine', 'hbs')
app.set('views', viewsPath)
hbs.registerPartials(partialsPath)
hbs.registerHelper('appDetails', () => {
const details = {
version: process.env.npm_package_version,
author: 'foobar'
}
return details
})
但在我的目录 /partials
中,文件 footer.hbs 我尝试使用助手:
<footer>
<p>Created by {{details.author}} | version: {{details.version}}</p>
</footer>
而且它不起作用。我搜索了该网站并阅读了:
- How to set a variable for the main handlebars layout without passing it to every route?
- nodejs + HBS (handlebars) : passing data to partials
- Passing variables through handlebars partial
在我的 Node 和 Express 应用程序中,有没有一种方法可以将数据发送到部分文件,而不必始终在 render
中发送数据?
最佳答案
Handlebars Helper 可以通过两种方式将数据添加到模板的渲染上下文:
1) 通过直接改变模板的上下文或 2) 通过使用私有(private)变量
示例:https://codepen.io/weft_digital/pen/JjPZwvQ
以下帮助程序将数据点 name
和 newData
更新或添加到模板的全局上下文,并且还使用 data 选项传递私有(private)变量。
Handlebars.registerHelper('datainjection', function(context, options) {
this.name = "Bob";
this.newData = "Updated"
return context.fn(this, { data: {private:"pirate"} });
});
在模板中调用 {{#datainjection}}{{/datainjection}}
block 之前,{{name}}
将设置为您指定的任何值传递给渲染函数,但 {{#datainjection}}{{/datainjection}}
block 内或之后出现的每次 {{name}}
都将使用更新后的值,在本例中为“Bob”。
我们传递的私有(private)变量只能在 {{#datainjection}}{{/datainjection}} block 中使用“@”装饰器访问。
例如:
{{#datainjection}}{{@private}}{{/datainjection}}
将渲染字符串“pirate”
关于node.js - 如何将对象发送给 Handlebars 中的助手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57839032/