2017-02-21 35 views
2

Я пытаюсь создать такой веб-форум, как Reddit. Есть сообщения верхнего уровня с ответами и ответы могут иметь ответы и так далее.Диапазон через произвольное количество вложенных фрагментов структур в HTML-шаблоне в Go

Плата выглядит следующим образом:

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>