Обращение к внешней переменной в loop Handlebars.js
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы обратиться к переменной из внешней области видимости внутри цикла Handlebars.js {{#each}}
, следует воспользоваться конструкцией {{../yourVariable}}
. С её помощью можно обратиться к переменной yourVariable
, находящейся в окружающем контексте.
Пример использования:
{{#each array}}
// Элемент массива
В цикле: {{this}}
// Переменная из внешней области видимости
Вне цикла: {{../externalVar}}
{{/each}}
В данном фрагменте кода {{this}}
выводит текущий элемент массива, а {{../externalVar}}
обращается к переменной externalVar
, находящейся за пределами цикла.
Доступ к корню контекста в сложных вложенных сценариях
При работе с вложенными циклами может возникнуть потребность обратиться к переменным из верхних уровней контекста. Для этого используйте {{@root.yourVariable}}
, чтобы обратиться к переменной yourVariable
, находящейся на корневом уровне контекста, не учитывая степень вложенности.
Пример:
{{#each topLevel}}
{{#each secondLevel}}
// Обращение к переменной на корневом уровне
Корневая переменная: {{@root.externalVar}}
{{/each}}
{{/each}}
Выражение {{@root.externalVar}}
выводит значение переменной externalVar
из корневого контекста.
Сохранение контекста: избегайте использования стрелочных функций
При регистрации вспомогательных функций следует отдавать предпочтение обычным функциональным выражениям, а не стрелочным функциям, чтобы сохранить корректный контекст this
.
Правильно:
Handlebars.registerHelper('myHelper', function() {
// 'this' ссылается на текущий контекст
return this.externalVar;
});
Неправильно:
Handlebars.registerHelper('myHelper', () => {
// 'this' может не соответствовать ожидаемому контексту
return this.externalVar;
});
Исследование вложенных объектов с помощью #each и #with
При работе с вложенными объектами удобно комбинировать помощники #each
и #with
для получения доступа к нужным данным.
Пример:
{{#each person}}
{{#with address}}
// Обращение к данным из родительского контекста
{{../personName}} проживает в {{city}}
{{/with}}
{{/each}}
С помощью {{../personName}}
, происходит обращение к родительскому контексту объекта person
, чтобы получить данные о personName
.
Пути: следите за точностью
Будьте внимательны при указании путей. Некорректные или неполные пути могут привести к неожиданным результатам или ошибкам в коде.
Смена контекста: следите за изменениями
Контекст может изменяться неожиданно, особенно после применения некоторых вспомогательных функций. Если доступ к переменной становится невозможным, проверьте текущий контекст.
Важно:
{{#let newContext=someValue}}
// Ожидается 'externalVar', а возвращается 'newContext'
{{../externalVar}}
{{/let}}
Будьте в курсе: синтаксис и применение
Уделите внимание изменению синтаксиса цепочек доступа (../
) в Handlebars 4 и выше версиях. Следите за обновлениями официальной документации, чтобы использовать актуальные способы доступа к родительским контекстам.
Визуализация
Можно представить работу в цикле {{#each}}
как игру с пузырьками (🔵🔵🔵). Будучи внутри цикла, мы находимся внутри одного из пузырьков (🔵). Чтобы перейти на другой уровень, нужно "лопнуть" этот пузырёк (💥).
Внутри цикла | Взаимодействие |
---|---|
Переменная цикла (🔵) | Лопнула (💥) |
А как достичь переменных, находящихся за пределами цикла? Используем "иглу" (📌).
Вне цикла | Взаимодействие |
---|---|
Глобальная переменная (🔵🔵🔵) | Достигнута (📌💥) |
Переменная внутри цикла (🔵🔒🔵) | Защищена (❌) |
Символ ../
выступает в роли "иглы" (📌) для доступа к внешним переменным.
Полезные материалы
- Встроенные помощники | Handlebars — официальная документация о встроенных помощниках функции each в Handlebars.js.
- Понимание области видимости в JavaScript | DigitalOcean — статья, раскрывающая основы области видимости в JavaScript.
- Замыкания – JavaScript | MDN — подробный обзор замыканий в JavaScript на MDN Web Docs.
- Область видимости и подъём переменных в JavaScript | DigitalOcean — статья о переменных, области видимости и подъёме переменных от DigitalOcean.
- Инлайн JavaScript в шаблонах Handlebars — урок о том, как вставлять код JavaScript непосредственно в шаблоны Handlebars.
- Функции высшего порядка :: Изысканный JavaScript — глава из книги "Изысканный JavaScript", посвящённая функциям высшего порядка.