11

如何在 GAE GO 的 html 模板中执行条件语句?我试图完成此操作以在选择 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具有价值时才评估为真。任何帮助将不胜感激。谢谢!

4

1 回答 1

18

基本模板包中没有相等语句。
这是来自 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.22013/12/01 发布)中,模板引擎已经更新并包含了新的操作符,包括比较。现在应该可以按预期工作:

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

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

于 2013-01-06T07:55:33.510 回答