Как передать несколько объектов в шаблон HTML Go

Вот мой массив объектов,

type PeopleCount []struct{
   Name  string
   Count int
}

type Consultation []struct{
   Name          string
   Opd_count     int
   Opinion_count int
   Req_count     int
}

Как передать оба объекта в шаблон HTML и расположить их в таблице?

2 ответа

Решение

Определите анонимную структуру с полями для подсчета людей и консультаций и передайте структуру в шаблон Выполнить метод:

var data = struct {
    PeopleCounts  []PeopleCount
    Consultations []Consultation
}{
    PeopleCounts:  p,
    Consultations: c,
}
err := t.Execute(w, &data)
if err != nil {
    // handle error
}

Используйте эти поля в шаблоне:

{{range .PeopleCounts}}{{.Name}}
{{end}}
{{range .Consultations}}{{.Name}}
{{end}}

Пример детской площадки

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

Вы также можете использовать карту вместо типа:

err := t.Execute(w, map[string]interface{}{"PeopleCounts": p, "Consultations": c})
if err != nil {
    // handle error
}

Недостатком использования карты является то, что опечатка в шаблоне может не привести к ошибке. Например, ``{{range .PopleConts}}{{end}}` silent ничего не делает.

Приведенный выше код предполагает, что PeopleCount и Consultation являются структурными типами, а не кусочками анонимных структурных типов:

type PeopleCount struct {
  Name  string
  Count int
}

type Consultation struct {
  Name          string
  Opd_count     int
  Opinion_count int
  Req_count     int
}

Обычно более удобно присвоить элементу именованный тип, чем дать слайсу именованный тип.

Если вы предпочитаете, определите неэкспортированную структуру с полями для подсчета людей и консультаций и передайте структуру в шаблон Выполнить метод:

type viewModel struct {
    PeopleCounts  []PeopleCount
    Consultations []Consultation
}

// ...

var data = viewModel{
    PeopleCounts:  p,
    Consultations: c,
}
err := t.Execute(w, &data)
if err != nil {
    // handle error
}

Этот подход в целом похож на ответ @Bravada. Это просто вопрос личного вкуса, использовать ли тип модели представления явно или анонимно.

Другие вопросы по тегам