2017-02-21 4 views
2

Reddit과 같은 웹 포럼 종류를 작성하려고합니다. 답장이있는 최상위 게시물이 있고 답장에 답글이있을 수 있습니다.Go의 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>