Зацикливание на массиве объектов в шаблоне (Go)

#templates #go

#шаблоны #Вперед

Вопрос:

Я передаю структуру (один элемент представляет собой массив объектов категории) в шаблон для рендеринга. В шаблоне у меня есть код, который выглядит примерно так:

 {.repeated section Categories}
    <p>{@}</p>
{.end}
  

Однако у каждой категории есть несколько собственных элементов, к которым мне нужно иметь доступ (например, Title). Я пробовал такие вещи, как {@ .Title} но, похоже, я не могу найти правильный синтаксис для выполнения этого. Как мне получить доступ к элементам данных в массиве во время цикла в шаблоне?

Комментарии:

1. Просто обратите внимание, что пакет шаблона был изменен с Go r60. Код в этом вопросе все равно будет выполняться (на данный момент) путем импорта «old / template» вместо «template».

2. Это описание нового пакета шаблонов только что появилось на Reddit: jan.newmarch.name/golang/template/chapter.html

Ответ №1:

Вы можете просто написать {Title} .

Всякий раз, когда пакет шаблона обнаруживает идентификатор, он пытается найти его в текущем объекте, и если он ничего не находит, он обращается к родительскому объекту (вплоть до корня). @ Есть только в том случае, если вы не хотите получать доступ к текущему объекту в целом, а не к одному из его атрибутов.

Поскольку я тоже не привык к шаблонному пакету, я создал небольшой пример:

 type Category struct {
    Title string
    Count int
}

func main() {
    tmpl, _ := template.Parse(`
        {.repeated section Categories}
            <p>{Title} ({Count})</p>
        {.end}
    `, nil)
    categories := []Category{
        Category{"Foo", 3},
        Category{"Bar", 5},
    }
    tmpl.Execute(os.Stdout, map[string]interface{} {
        "Categories": categories,
    })
}