Каков наилучший способ создания цикла в шаблоне 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>
Другие вопросы по тегам