![](/img/trans.png)
[英]How can I use multiple html templates (ie. have a base template or footer template) in Go?
[英]In a template, how can I have a counter?
我需要为我的项目使用基本的增量算法和循环,以保持模板的可读性,并使用值填充9x9网格。 这些值存储在字符串数组中,因此必须能够控制索引。
这是定义了两个模板函数的处理程序:
func HomeHandler(w http.ResponseWriter, req *http.Request) {
t := template.New("home.html").Funcs(template.FuncMap{
"loop": func(n int) []struct{} {
return make([]struct{}, n)
},
}).Funcs(template.FuncMap{
"inc": func(n int) int {
return n + 1
},
})
t, err := t.ParseFiles("templates/home.html")
if err != nil {
log.Print("template/home error:", err)
}
t.ExecuteTemplate(w, "home.html", nil)
}
为了创建网格,我使用如下循环函数:
{{ range loop 3}}
<tbody>
{{ range loop 3}}
<tr>
{{ range loop 9}}
<td> <input value="1" type="text" name="value[]" maxlength="1" size="1">
{{end}}
{{end}}
{{end}}
但是,我想使用我的数据将输入元素的value属性设置为正确的值。 我相信我可以通过以下方式访问索引:
{{index .MyArray 3}}
我将用需要正确递增的计数器替换“ 3”。
不幸的是,似乎我无法正确地重新分配变量,因为我最多只能将其从0递增到1。
这是我的柜台模板:
{{$count := 0}}
{{ range loop 3}}
<tbody>
{{ range loop 3}}
<tr>
{{ range loop 9}}
{{$count := inc $count}}
<td> <input value="1" type="text" name="value[]" maxlength="1" size="1">
{{end}}
{{end}}
{{end}}
由于模板可以轻松地对实际数据进行处理,因此反过来又如何呢? 您可以不使用loop
和inc
开始
{{ range $index, $value := .MyArray }}
<td><input value="{{ $value }}" type="text" name="value[]" maxlength="1" size="1">
{{ end }}
这将为您提供所需的所有输入,但是没有周围的标记,那么我们如何获得呢? 一点模块化的算法。 定义一个模板函数,如下所示:
"each": func(interval, n int) bool {
return n % interval == 0
}
然后我们就可以解决问题:
{{ range $index, $value := .MyArray }}
{{ if each 27 $index }}<tbody>{{ end }}
{{ if each 9 $index }}<tr>{{ end }}
<td><input value="{{ $value }}" type="text" name="value[]" maxlength="1" size="1">
{{ end }}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.