通过Go中HTML模板中任意数量的嵌套结构片段进行范围调整

her*_*ain 2 templates nested go go-templates

我正在尝试建立一个类似Reddit的网络论坛.有回复的顶级帖子,回复可以有回复等等.

董事会看起来像这样:

var board map[string]*Post
Run Code Online (Sandbox Code Playgroud)

和a Post:

type Post struct {
  Title string
  Body string
  ID string
  PostNum int
  Replies []*Post
}
Run Code Online (Sandbox Code Playgroud)

我将如何使用模板通过嵌套到范围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>                                                        
Run Code Online (Sandbox Code Playgroud)

这只允许我通过两个级别的回复(并且你可以看到使用重复的代码),我需要能够通过任意数量的级别Replies.

Cer*_*món 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}}
Run Code Online (Sandbox Code Playgroud)

游乐场示例