仅在[] struct不为空时才继续

时间:2017-02-22 09:12:09

标签: go go-templates

我有一个[]结构,它可以没有内容,但也可能有内容:

Anleitung  []struct {
    Name string `json:"blog"`
    Link string `json:"link"`
} `json:"anleitung"`

在我的模板中,我尝试检查Anleitung是否包含某些内容,然后继续:

{{ ne $jb.Anleitung "" }}
     <div class="btn-group">
        <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              <span class="badge">4</span> Anleitungen <span class="caret"></span>
        </button>
        <ul class="dropdown-menu">
            {{ range $anl := $jb.Anleitung }}
                 <li><a href="{{ $anl.Link }}?ref=jbguide">{{ $anl.Name }}</a></li>
             {{ end }}
         </ul>
      </div>
{{ end }}

编译整个事情会给我以下错误:

  

呈现index模板时出错:模板:index.tmpl:131:意外{{end}}

第131行是模板文件中的最后一行。

有没有办法检查[]结构是否包含任何数据?

2 个答案:

答案 0 :(得分:2)

您可以简单地使用{{with}}操作。引自text/template的包文档:

{{with pipeline}} T1 {{end}}
    If the value of the pipeline is empty, no output is generated;
    otherwise, dot is set to the value of the pipeline and T1 is
    executed.

由于{{with}}也设置了管道,因此请将{{range}}修改为:

{{ range $anl := . }}

使用它:

{{ with $jb.Anleitung }}
     <div class="btn-group">
        <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              <span class="badge">4</span> Anleitungen <span class="caret"></span>
        </button>
        <ul class="dropdown-menu">
            {{ range $anl := . }}
                 <li><a href="{{ $anl.Link }}?ref=jbguide">{{ $anl.Name }}</a></li>
             {{ end }}
         </ul>
      </div>
{{ end }}

更进一步,您可以简化{{range}}因为我们不需要$anl变量,{{range}}也会设置管道:

{{ range . }}
    <li><a href="{{.Link}}?ref=jbguide">{{.Name}}</a></li>
{{ end }}

测试它:

t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{}
fmt.Println("First, no params:")
if err := t.Execute(os.Stdout, m); err != nil {
    fmt.Println(err)
}

fmt.Println("Next, 2 values:")
m = map[string]interface{}{
    "Anleitung": []struct {
        Name string `json:"blog"`
        Link string `json:"link"`
    }{
        {"Bob", "http://google.com"},
        {"Alice", "http://amazon.com"},
    },
}
if err := t.Execute(os.Stdout, m); err != nil {
    fmt.Println(err)
}

输出(在Go Playground上尝试):

First, no params:

Next, 2 values:


     <div class="btn-group">
        <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              <span class="badge">4</span> Anleitungen <span class="caret"></span>
        </button>
        <ul class="dropdown-menu">

                 <li><a href="http://google.com?ref=jbguide">Bob</a></li>

                 <li><a href="http://amazon.com?ref=jbguide">Alice</a></li>

         </ul>
      </div>

答案 1 :(得分:1)

两件事:

  1. 您的ne语法错误。它需要以if开头,然后您的{{ end }}将不再是语法错误。
  2. 你的结构永远不会等于"",因为它不是一个字符串。如果您想知道切片是否为空,则必须检查其长度。在模板中执行此操作的方法是as documentedpipeline。实际上,这将使#1过时。