GAE Go模板包中的条件语句

时间:2013-01-06 04:40:38

标签: google-app-engine templates go conditional

如何在GAE GO中的html模板中执行条件语句?我试图完成此操作,以便在select html标记中选择一个选项:

<select name=".Grade">
          <option value=""></option>
          <option value="1" {{ if .Grade="1" }} selected="selected" {{ end }}>Grade One</option>
          <option value="2" {{ if .Grade="2" }} selected="selected" {{ end }}>Grade Two</option>
          <option value="3" {{ if .Grade="3" }} selected="selected" {{ end }}>Grade Three</option>
          <option value="4" {{ if .Grade="4" }} selected="selected" {{ end }}>Grade Four</option>
          <option value="5" {{ if .Grade="5" }} selected="selected" {{ end }}>Grade Five</option>
          <option value="6" {{ if .Grade="6" }} selected="selected" {{ end }}>Grade Six</option>
</select>

{{ if .Grade }} selected="selected" {{ end }} 

在参考文档中但如果.Grade具有值,则仅评估为true。任何帮助将受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:17)

基本模板包中没有相等的声明 这是关于它的interesting discussion from golang-nuts

您有几种可能性:

  • 定义一个相等的外部函数,就像Russ Cox在golang-nuts线程中建议的那样,用if条件测试它
  • 使用基本模板包可以理解的东西(参见下面的代码)
  • 从模板中删除一些逻辑:您可以构造一个带有selected布尔字段的数据类型,而不是拥有6个硬编码字段,并将一个包含6个这些对象的数组提供给带有range的模板声明

我使用一片布尔值重新创建了你的例子:

func main() {
    temp,err := template.ParseFiles("template.html")
    if err != nil {
        panic(err)
    }

    g := make([]bool, 7)
    g[1] = true
    temp.Execute(os.Stdout, &g)
}

模板中的一行如下所示:

<option value="3"{{ if index . 3 }} selected="selected"{{ end }}>Grade Three</option>

这对我来说不太好看。但我会说所有的解决方案都有它们的缺点,这是一个品味问题(第三种解决方案应该更清洁,但对于这么简单的事情可能会被认为是过度杀伤)。

编辑(2013/12/11)

Go 1.2released on 2013/12/01)中,template engine已更新并包含新运算符,包括比较。现在应该按预期工作:

{{if eq .Grade 1 }} selected="selected" {{end}}

但您仍然可以选择在模板中保留尽可能少的逻辑。