2016-06-04 7 views
1

Ich benötige grundlegende Inkrementarithmetik und Schleife für mein Projekt, um die Vorlage lesbar zu halten und ein 9x9 Raster mit Werten zu füllen. Die Werte werden in einem String-Array gespeichert. Daher ist es notwendig, die Kontrolle über den Index zu haben.In einer Vorlage, wie kann ich einen Zähler haben?

Hier ist mein Handler mit beiden Template-Funktionen definiert:

func HomeHandler(w http.ResponseWriter, req *http.Request) { 
    t := template.New("home.html").Funcs(template.FuncMap{ 
     "loop": func(n int) []struct{} { 
      return make([]struct{}, n) 
     }, 
    }).Funcs(template.FuncMap{ 
     "inc": func(n int) int { 
      return n + 1 
     }, 
    }) 

    t, err := t.ParseFiles("templates/home.html") 

    if err != nil { 
     log.Print("template/home error:", err) 
    } 
    t.ExecuteTemplate(w, "home.html", nil) 
} 

das Gitter ich die Loop-Funktion wie so verwenden zu erstellen: Allerdings

{{ range loop 3}} 
<tbody> 
    {{ range loop 3}} 
    <tr> 
     {{ range loop 9}} 
     <td> <input value="1" type="text" name="value[]" maxlength="1" size="1"> 
     {{end}} 
    {{end}} 
{{end}} 

, würde Ich mag den Wert einzustellen Attribut des Eingabeelements auf den richtigen Wert mit meinen Daten. Ich glaube, dass ich den Index mit dem folgenden zugreifen:

{{index .MyArray 3}} 

Ich werde „3“ mit einem Zähler ersetzen, die ich brauche werde in der Lage sein, richtig zu erhöhen.

Leider scheint es, als ob ich die Variable nicht korrekt neu zuweisen kann, da ich sie höchstens von 0 auf 1 erhöhen kann.

Hier ist meine Vorlage mit meinem Zähler:

{{$count := 0}} 
{{ range loop 3}} 
<tbody> 
    {{ range loop 3}} 
    <tr> 
     {{ range loop 9}} 
     {{$count := inc $count}} 
     <td> <input value="1" type="text" name="value[]" maxlength="1" size="1"> 
     {{end}} 
    {{end}} 
{{end}} 

Antwort

2

Wie wäre es anders herum zu tun, da im Bereich über die eigentlichen Daten ist etwas, das Vorlagen leicht tun? Sie können mit

{{ range $index, $value := .MyArray }} 
<td><input value="{{ $value }}" type="text" name="value[]" maxlength="1" size="1"> 
{{ end }} 

ohne loop und inc und starten Sie tun, was Sie alle Eingaben erhalten, die Sie benötigen, aber ohne das umgebende Markup, so wie bekommen wir das? Ein bisschen modulare Arithmetik. Definieren Sie eine Template-Funktion wie folgt:

"each": func(interval, n int) bool { 
    return n % interval == 0 
} 

dann können wir Pad Dinge aus:

{{ range $index, $value := .MyArray }} 
{{ if each 27 $index }}<tbody>{{ end }} 
{{ if each 9 $index }}<tr>{{ end }} 
<td><input value="{{ $value }}" type="text" name="value[]" maxlength="1" size="1"> 
{{ end }}