Как отправить объект помощнику в Handlebars?

Изучение ручек и Express Я пытаюсь изучить способ отправки объекта без необходимости всегда создавать рендер. Например, если у меня есть:

const details = {
  version: process.env.npm_package_version,
  author: 'foobar'
}

Я могу отправить это в мой footer.hbs по частям из:

app.get('/', (req, res) => {
  res.render('index', {
    details
  })
})

но ищу способ отправить его в файл шаблона, а не всегда в рендере, я читал в документации о блокировать помощников и пробовал:

// 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 and Express способ отправлять данные в файл partials без необходимости всегда отправлять их в render?


person DᴀʀᴛʜVᴀᴅᴇʀ    schedule 08.09.2019    source источник


Ответы (1)


Есть два способа, которыми Handlebars Helper может добавить данные в контекст отрисовки шаблона:

1) путем прямого изменения контекста шаблона или 2) путем использования частных переменных

Пример: https://codepen.io/weft_digital/pen/JjPZwvQ.

Следующий помощник обновляет или добавляет точки данных name и newData в глобальный контекст шаблона, а также передает частную переменную, используя параметр данных.

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}}

отобразит строку "пират"

person Neil VanLandingham    schedule 13.09.2019