如何将对象发送给 Handlebars 中的助手?

How do you send an object to a helper in Handlebars?

学习 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>

而且它不起作用。我搜索了网站并阅读了:

在我的 Node 和 Express 应用程序中,有没有一种方法可以将数据发送到部分文件,而不必总是在 render 中发送?

Handlebars Helper 可以通过两种方式将数据添加到模板的呈现上下文:

1) 通过直接改变模板的上下文或 2) 通过使用私有变量

示例:https://codepen.io/weft_digital/pen/JjPZwvQ

以下帮助程序将数据点 namenewData 更新或添加到模板的全局上下文中,它还使用数据选项传递私有变量。

Handlebars.registerHelper('datainjection', function(context, options) {
     this.name = "Bob";
     this.newData = "Updated"
     return context.fn(this, { data: {private:"pirate"} });
});

在您调用模板中的 {{#datainjection}}{{/datainjection}} 块之前,{{name}} 将被设置为您传递给渲染函数的任何值,但是 {{name}}{{#datainjection}}{{/datainjection}} 块将使用更新后的值,在本例中为 "Bob"。

我们传递的私有变量只能在 {{#datainjection}}{{/datainjection}} 块中使用“@”装饰器访问。

例如:

{{#datainjection}}{{@private}}{{/datainjection}}

将呈现字符串 "pirate"