2014-09-26 3 views
0

Я пытаюсь создать html-шаблон для отображения сообщений через html/template Go package. Я также хочу сделать разбивку на страницы на моей странице, чтобы отобразить 5 сообщений на странице.Каков наилучший способ создания цикла в шаблоне go html?

Итак, я беру счетчик сообщений из своего почтового хранилища, деля его по столбцам на значение страницы и округляя его (ceil). Это общее количество страниц с имеющимися в настоящее время сообщениями.

Передаю общее количество страниц в мой шаблон html. Теперь, в моем шаблоне html мне нужно отобразить кнопки страницы от 1 до общего числа.

В пакете text/html есть замечательная документация о том, как работать с конвейерами, но я не нашел примера создания простого цикла.

У меня есть решение, но я не уверен, что он хороший. я могу передать в шаблон не только общее количество страниц, но массив доступных страниц, так что в моем шаблоне, я могу сделать что-то вроде:

{{range .pages}} 
    <div class="page"><a href="/posts/{{.}}">{{.}}</a></div> 
{{end}} 

Но, может быть, есть лучший способ сделать это, чем передача массив страниц? Я также знаю о возможности передачи пользовательских функций в шаблон. Это может быть решение?

+1

Я не знаю много о 'template'; у кого-то может быть лучший ответ. Но диапазон выглядит разумным для меня. – twotwotwo

+2

Это не огромная экономия, возможно, не стоит того, но вы можете подделывать итерирование чисел в шаблоне без создания массива фактических ints с помощью пустой struct: '" pages ": make ([] struct {}, 16) 'при определении вашего контекста и' {{range $ pageNum, $ _: = .pages}} 'в шаблоне: http://play.golang.org/p/jvFp1TptMV. Трюк пустой-структуры - от https://github.com/bradfitz/iter/blob/master/iter.go – twotwotwo

ответ

1

Правило состоит в том, что шаблон должен содержать минимальную логику (и именно поэтому родные функции и элементы управления настолько ограничены в пакете шаблонов).

Вы должны подготовить свои данные в контроллер, поместив его в выделенную структуру (которая будет передана шаблону). Затем вы можете отобразить эту структуру (состоящую из переменных и массивов) в шаблон, используя функцию диапазона, как вы намеревались сделать.

0

попробовать это, у меня есть сделать все возможное, ...

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> 
Смежные вопросы