2017-02-21 22 views
2

我试图建立一个类似Reddit的网络论坛。有顶级帖子和答复,答复可以有答复等。通过在HTML模板中的任意数量的嵌套结构切片的范围去

一个板看起来是这样的:

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的水平。

回答

6

要缓解层次结构,请使用执行自己的命名模板。在下面的例子中,模板“回复”执行“答复”,以显示子回复:

{{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}} 

Playground Example

4

你刚才已经定义了一个递归类型。您可以通过定义递归模板来渲染它:

{{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>