GAE Go模板包中的条件语句

sag*_*git 10 google-app-engine conditional templates go

如何在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>
Run Code Online (Sandbox Code Playgroud)

{{ if .Grade }} selected="selected" {{ end }} 
Run Code Online (Sandbox Code Playgroud)

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

lbo*_*onn 17

基本模板包中没有相等的语句.
这是一个关于它的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)
}
Run Code Online (Sandbox Code Playgroud)

模板中的一行如下所示:

<option value="3"{{ if index . 3 }} selected="selected"{{ end }}>Grade Three</option>
Run Code Online (Sandbox Code Playgroud)

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

编辑(2013/12/11)

Go 1.2(2013/12/01发布)中,模板引擎已更新,包括新的运算符,包括比较.现在应该按预期工作:

{{if eq .Grade 1 }} selected="selected" {{end}}
Run Code Online (Sandbox Code Playgroud)

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