在go html模板中创建循环的最佳方法是什么?

时间:2014-09-26 05:17:26

标签: templates go go-html-template

我正在尝试创建一个html模板,用于通过html/template Go包显示帖子。 我还想在我的页面上进行分页,每页显示5个帖子。

所以我从我的帖子库中取出帖子计数,将其除以每页的帖子值并将其四舍五入(ceil)。这是当前可用帖子的总页数。

我将总页数传递给我的html模板。 现在,在我的html模板中,我需要显示页面按钮从1到总数

text/html包中有一个关于如何使用管道的精彩文档,但我没有找到创建简单循环的任何示例。

我得到了解决方案,但我不确定它是好的。 我不仅可以传递模板的总页数,还可以传递给可用页面的数组,因此在我的模板中我可以执行以下操作:

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

但也许有更好的方法来做到这一点,而不是传递一个页面数组? 我也知道将自定义函数传递给模板的可能性。这可能是一个解决方案吗?

2 个答案:

答案 0 :(得分:1)

规则是模板必须包含尽可能小的逻辑(以及原生函数和控件如此限制在模板包中的原因)。

您应该通过将数据放入专用结构(传递给模板)来将数据准备到控制器中。然后,您可以按照预期的方式使用范围函数将此结构(由变量和数组组成)显示到模板中。

答案 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>