学习车把和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
})
但是在文件footer.hbs的目录
/partials
中,我尝试使用辅助程序:<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 and Express应用程序中,有一种方法可以将数据发送到partials文件,而不必总是在
render
中发送数据吗? 最佳答案
Handlebars Helper有两种方法可以将数据添加到模板的呈现上下文中:
1)通过直接更改模板的上下文或2)使用私有变量
示例:https://codepen.io/weft_digital/pen/JjPZwvQ
以下帮助程序将数据点name
和newData
更新或添加到模板的全局上下文中,并且还使用data选项传递了一个私有变量。
Handlebars.registerHelper('datainjection', function(context, options) {
this.name = "Bob";
this.newData = "Updated"
return context.fn(this, { data: {private:"pirate"} });
});
在模板中调用
{{#datainjection}}{{/datainjection}}
块之前,会将{{name}}
设置为传递给render函数的任何值,但是在{{name}}
块内或之后每次出现的{{#datainjection}}{{/datainjection}}
都将使用更新后的值,在这种情况下为“鲍勃”。我们正在传递的私有变量只能使用“ @”修饰符在{{#datainjection}} {{/ datainjection}}块中进行访问。
例如:
{{#datainjection}}{{@private}}{{/datainjection}}
将呈现字符串“海盗”