Каков наилучший способ создания цикла в шаблоне Go HTML?
Я пытаюсь создать HTML-шаблон для отображения сообщений через html/template
Перейти пакет Я также хочу сделать нумерацию страниц на своей странице, чтобы отобразить 5 сообщений на странице.
Поэтому я беру количество постов из своего репозитория постов, деля его на количество постов в расчете на страницу и округляя его (ceil). Это общее количество страниц с сообщениями, доступными в настоящее время.
Я передаю общее количество страниц в мой HTML-шаблон. Теперь в моем HTML-шаблоне мне нужно отобразить кнопки на странице от 1 до общего количества.
в text/html
В пакете есть отличная документация о том, как работать с конвейерами, но я не нашел ни одного примера создания простого цикла.
Я получил решение, но я не уверен, что оно хорошее. Я могу передать шаблону не только общее количество страниц, но и массив доступных страниц, поэтому в своем шаблоне я могу сделать что-то вроде:
{{range .pages}}
<div class="page"><a href="/posts/{{.}}">{{.}}</a></div>
{{end}}
Но, может быть, есть лучший способ сделать это, чем передать массив страниц? Я также знаю о возможности передачи пользовательских функций в шаблон. Может ли это быть решением?
2 ответа
Правило состоит в том, что шаблон должен содержать минимально возможную логику (и это причина, по которой собственные функции и элементы управления настолько ограничены в пакете шаблона).
Вы должны подготовить свои данные в контроллере, поместив их в специальную структуру (для передачи в шаблон). Затем вы можете отобразить эту структуру (состоящую из переменных и массивов) в шаблон, используя функцию диапазона, как вы и предполагали.
Попробуй это, я приложу все усилия...
package main
import "html/template"
import "os"
type data struct {
Url string
Title string
}
type show struct {
Pages []data
}
const html = `<html>
{{range .Pages}}
<div class="page"><a href="/posts/{{.Url}}">{{.Title}}</a>
</div>
{{end}}
</html>`
func show_template() {
webpage, _ := template.New("template").Parse(html)
mydata := []data{{
Url: "page-1.html",
Title: "go to page 1",
}, {
Url: "page-2.html",
Title: "go to page 2",
}, {
Url: "page-3.html",
Title: "go to page 3",
}, {
Url: "page-3.html",
Title: "go to page 3",
}}
web_data := show{mydata}
webpage.Execute(os.Stdout, web_data)
}
func main() {
show_template()
}
и это результат..
<html>
<div class="page"><a href="/posts/page-1.html">go to page 1</a></div>
<div class="page"><a href="/posts/page-2.html">go to page 2</a></div>
<div class="page"><a href="/posts/page-3.html">go to page 3</a></div>
<div class="page"><a href="/posts/page-3.html">go to page 3</a></div>
</html>