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