【问题标题】:Range through an arbitrary number of nested slices of structs in an HTML template in Go在 Go 中的 HTML 模板中遍历任意数量的嵌套结构切片
【发布时间】:2017-02-22 04:40:07
【问题描述】:

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

板看起来像这样:

var board map[string]*Post

还有一个Post

type Post struct {
  Title string
  Body string
  ID string
  PostNum int
  Replies []*Post
}

如何使用模板来遍历嵌套的 Replies 切片(请记住,每个 *Post 都包含一个 Replies 切片,其中包含 *PostsReplies 等等)?

到目前为止我所拥有的:

<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

【问题讨论】:

    标签: templates go nested go-templates


    【解决方案1】:

    要向下递归层次结构,请使用可自行执行的命名模板。在以下示例中,模板“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}}
    

    Playground Example

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2021-11-18
        相关资源
        最近更新 更多