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

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

type PeopleCount []struct{
   Name  string
   Count int
}

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

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


person Priyanka    schedule 11.09.2015    source источник


Ответы (2)


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

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}}` молчание ничего не делает.

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

type PeopleCount struct {
  Name  string
  Count int
}

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

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

person Cerise Limón    schedule 11.09.2015

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

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. Это просто вопрос личного вкуса, использовать тип модели представления явно или анонимно.

person Rick-777    schedule 11.09.2015