Значения .Site.Data недоступны внутри блока диапазона

Итак, я только что заметил, что когда я пытаюсь получить доступ к чему-либо из самого .Site внутри блока диапазона, он возвращается как null / blank.

Вот пример:

<div class="row weekday">
  {{ .Site.Data.company.social_media.whatsapp }}
  {{ range $entry := sort .Site.Data.events "order" "asc" }}
  <div class="col-sm-6 col-md-4 col-lg-4">
    {{ .Site.Data.company.social_media.whatsapp }}
    {{ partial "events_detail.html" (dict "entry" $entry) }}
  </div>
  {{ end }}
</div>

Первый .Site.Data.company.social_media.whatsapp (перед диапазоном) отображает номер телефона.

Второй .Site.Data.company.social_media.whatsapp (после диапазона) ничего не отображает.

То же самое происходит в частичном events_detail.html. Если я пытаюсь получить доступ к .Site изнутри частичной области, он возвращает null. Я тоже пытался передать его на (dict ...), но не повезло.

Что мне здесь не хватает?


person Ramon Moraes    schedule 20.03.2021    source источник


Ответы (1)


Мне не хватало того, как Хьюго управлял прицелами для точки. Вы можете прочитать более подробное объяснение этого (и других важных понятий) здесь:

https://regisphilibert.com/blog/2018/02/hugo-the-scope-the-context-and-the-dot/

В резюме (извлечено из приведенной выше ссылки):

Корневой контекст, доступный вам в baseof.html и макетах, всегда будет контекстом страницы. По сути, все, что вам нужно для создания этой страницы, находится в этой точке. .Title, .Permalink, .Resources, что угодно.

Даже информация вашего сайта хранится в контексте страницы с .Site, готовым к использованию.

Но в шаблоне Go в тот момент, когда вы входите в функцию, вы теряете этот контекст, поскольку ваша драгоценная точка или контекст заменяется собственной… точкой функции.

(...)

То же самое и здесь, как только вы открыли итерацию с диапазоном, контекст - это тот элемент, на который в данный момент указывает курсор. Вы потеряете контекст своей страницы в пользу контекста диапазона.

{{ range .Data.Pages }}
    {{/* Here the dot is that one page 'at cursor'. */}} 
    {{ .Permalink }}
{{ end }}

К счастью, Хьюго хранит корневой контекст файла шаблона в $, поэтому независимо от того, насколько глубоко вы вложены в с или диапазон, вы всегда можете получить верхний контекст. В базовом файле шаблона это обычно будет ваша страница.

{{ with .Title }}
    {{/* Dot is .Title */}} 
    <h1>{{ . }}</h1>
    {{/* $ is the top level page */}} 
    <h3>From {{ $.Title }}</h3>
{{ end }}
person Ramon Moraes    schedule 20.03.2021