学习车把和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

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


将呈现字符串“海盗”

10-06 07:20