2013-01-06 14 views
9

Come è possibile eseguire un'istruzione condizionale nel modello html in GAE GO? Stavo cercando di raggiungere questo obiettivo per fare un'opzione selezionata in un tag HTML di selezione:Istruzione condizionale nel pacchetto modello GAE Go

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

C'è

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

nel documento di riferimento, ma questa valuta solo true se .Grade ha valore. Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

risposta

15

Non esiste un'istruzione di uguaglianza nel pacchetto del modello di base.
Ecco un interesting discussion from golang-nuts su di esso.

Esistono diverse possibilità:

  • definiscono una funzione esterna per la parità, come quello Russ Cox suggerisce nel thread golang-dadi e testare con un if condizione
  • uso qualcosa pacchetto modello di base può capire (vedere il mio codice di seguito)
  • rimuovere qualche logica dal modello: invece di avere 6 campi codificati, è possibile creare un tipo di dati con un campo booleano selected e assegnare un array di 6 di questi oggetti a un modello con un range dichiarazione

Ho ricreato il vostro esempio utilizzando una fetta di booleani:

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) 
} 

Una linea nel modello si presenta così:

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

Questo non sembra così buono con me. Ma direi che tutte le soluzioni hanno i loro svantaggi e che questa è una questione di gusti (la terza soluzione dovrebbe essere più pulita ma potrebbe essere considerata eccessiva per una cosa così semplice).

Edit (2013/12/11)

In Go 1.2 (released on 2013/12/01), il template engine è stata aggiornata e include nuovi operatori, tra cui il confronto. Questo ora dovrebbe funzionare come previsto:

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

È comunque possibile scegliere di mantenere il minor numero di logica il più possibile nei modelli, però.

+1

Go 1.2 rilasciato – ithkuil