node.js - 如何将对象发送给 Handlebars 中的助手?

标签 node.js express handlebars.js handlebarshelper

学习 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) 通过使用私有(private)变量

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

以下帮助程序将数据点 namenewData 更新或添加到模板的全局上下文,并且还使用 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/

相关文章:

javascript - Handlebars 不解析?

ember.js - 在 Ember.js 模板中,如何打印出 HTML 将使用的模型属性,例如用于图像的 src 或用于链接的 href

javascript - npm live-server 安装 : symlink error (even when running as root/admin)

javascript - 卡在从第三帧抓取数据

node.js - Passport req.logOut() 函数不起作用?

javascript - 使用每个 Handlebars 模板

javascript - NodeJS - 如何将变量发送到嵌套回调? (MongoDB 查找查询)

javascript - 调用中间件中的对象函数

node.js - Mongoose 错误不支持的投影选项 : sort: { createdAt: -1 }

json - ExpressJS POST 无法记录正文