在 Go 中的 HTML 模板中遍历任意数量的嵌套结构切片
Range through an arbitrary number of nested slices of structs in an HTML template in Go
我正在尝试建立一个类似于 Reddit 的网络论坛。有顶帖有回复,回复可以有回复等等。
看板是这样的:
var board map[string]*Post
和一个Post
:
type Post struct {
Title string
Body string
ID string
PostNum int
Replies []*Post
}
我如何使用模板来遍历嵌套的 Replies
切片(请记住,每个 *Post
包含一个 Replies
切片,其中包含 *Posts
Replies
等等)?
我目前拥有的:
<div id="posts">
{{ .Title }}
{{ .Body }}
<ul>
{{ range $key, $value := .Replies }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
<ul>
{{ range $key, $value := $value.Replies }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
{{ end }}
</ul>
{{ end }}
</ul>
</div>
这只允许我通过两个级别的回复(并且如您所见使用重复代码),我需要能够通过任意数量的级别 Replies
.
要向下递归层次结构,请使用自行执行的命名模板。在以下示例中,模板 "replies" 执行 "replies" 以显示子回复:
{{define "main"}}
<div id="post">
{{.Title}}
{{.Body}}
{{template "replies" .Replies}}
</div>
{{end}}
{{define "replies"}}
{{if .}}
<ul>
{{range . }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{.Title}}</b></div>
</div>
<div class="postBody">{{.Body}}</div>
{{template "replies" .Replies}}
</li>
{{end}}
</ul>
{{end}}
{{end}}
您刚刚定义了一个递归数据类型。您可以通过定义递归模板来渲染它:
{{define "replies"}}
<ul>
{{ range $key, $value := . }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
{{template "replies" .Replies}}
{{end}}
</ul>
{{end}}
<div id="posts">
{{ .Title }}
{{ .Body }}
{{ template "replies" .Replies }}
</div>
我正在尝试建立一个类似于 Reddit 的网络论坛。有顶帖有回复,回复可以有回复等等。
看板是这样的:
var board map[string]*Post
和一个Post
:
type Post struct {
Title string
Body string
ID string
PostNum int
Replies []*Post
}
我如何使用模板来遍历嵌套的 Replies
切片(请记住,每个 *Post
包含一个 Replies
切片,其中包含 *Posts
Replies
等等)?
我目前拥有的:
<div id="posts">
{{ .Title }}
{{ .Body }}
<ul>
{{ range $key, $value := .Replies }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
<ul>
{{ range $key, $value := $value.Replies }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
{{ end }}
</ul>
{{ end }}
</ul>
</div>
这只允许我通过两个级别的回复(并且如您所见使用重复代码),我需要能够通过任意数量的级别 Replies
.
要向下递归层次结构,请使用自行执行的命名模板。在以下示例中,模板 "replies" 执行 "replies" 以显示子回复:
{{define "main"}}
<div id="post">
{{.Title}}
{{.Body}}
{{template "replies" .Replies}}
</div>
{{end}}
{{define "replies"}}
{{if .}}
<ul>
{{range . }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{.Title}}</b></div>
</div>
<div class="postBody">{{.Body}}</div>
{{template "replies" .Replies}}
</li>
{{end}}
</ul>
{{end}}
{{end}}
您刚刚定义了一个递归数据类型。您可以通过定义递归模板来渲染它:
{{define "replies"}}
<ul>
{{ range $key, $value := . }}
<li class="post">
<div class="postHead">
<div class="postTitle"><b>{{ $value.ID }}</b></div>
</div>
<div class="postBody">{{ $value.PostNum }}</div>
</li>
{{template "replies" .Replies}}
{{end}}
</ul>
{{end}}
<div id="posts">
{{ .Title }}
{{ .Body }}
{{ template "replies" .Replies }}
</div>