Über die Bedingungen in Vorlagen

Die Verwendung von if-Anweisungen innerhalb von templates wirklich, ist mir rätselhaft.

Ich versuche eine class = "active" innerhalb einer nav-Liste gemacht mit golang-Vorlagen, um eine Registerkarte "Grundeinstellungen" im Menü, das erkennt die aktive Registerkarte.
Hier ist mein Versuch :

{{define "header"}}
<!DOCTYPE html>
<html>
    <head>
        <title>Geoprod</title>
        {{template "stylesheet" .}}
    </head>
    <body>
        <nav class="navbar" role="navigation">
          <div class="navbar-header">
            <a{{if eq .Active "accueil"}} class="active"{{end}} href="/">Geoprod</a>
          </div>
          <div class="navbar-body">
            <ul class="navbar-list">
                <li{{if eq .Active "societe"}} class="active"{{end}}><a href="/societe">Soci&eacutet&eacute</a></li>
                <li{{if eq .Active "dossier"}} class="active"{{end}}><a href="/dossier">Dossier</a></li>
                <li{{if eq .Active "temps"}} class="active"{{end}}><a href="/temps">Temps</a></li>
                <li{{if eq .Active "mails"}} class="active"{{end}}><a href="/mails">Mails</a></li>
            </ul>
          </div>
        </nav>
{{end}}

Und im main.go :

var FuncMap = template.FuncMap{
    "eq": func(a, b interface{}) bool {
        return a == b
    },
}
var templates = template.Must(template.ParseGlob("templates/*.html"))

und in der func main()

templates.Funcs(FuncMap)

Das Programm kompiliert, aber ich habe herausgefunden, das hinzufügen der {{if eq .Active "something"}} class="active"{{end}} ( ^ ^ , die ich hier im Lieferumfang enthalten) bewirkt, daß das Programm nicht anzeigen-text nicht mehr. Irgendeine Idee warum?

  • 2 Dinge. Haben Sie überprüft, für Fehler, die auf ausgeführt werden? Auch: Sie müssen rufen Sie die Funcs() vor der übergabe der Vorlagen. Ansonsten ist die funcs nicht bekannt. Auf der anderen Seite: der eq func ist bereits definiert golang.org/pkg/text/template/#hdr-Functions
  • 1: NÖ, keine Fehler in der log 2: Seltsam, ich habe gerade gelesen, dieser an diesem morgen, Rob Pike sagt, dass es bis zu einem jeden von uns zu schreiben, diese Funktion, wenn wir es brauchen. Dies ist eine neue Ergänzung zu Gehen ?
  • wenn es gibt keine Ausgabe an alle, es hat ein Fehler sein. Auch die Implementierung von eq fehlt. Bitte haben Sie einen Blick hier: golang.org/ref/spec#Comparison_operators vor Allem der Teil mit vergleichen Schnittstelle Werte.
  • Sind Sie sicher, es ist der {{if}} Ausdruck, die das problem verursachen? Es sieht aus wie Sie haben falsche Namen für die Vorlage, versuchen Sie ändern {{define "header"}} zu {{define "header.html"}}
  • Entfernen der wenn bewirkt, dass die Seite angezeigt werden soll (nur den code nicht enthalten, die class="active"). Die header-template ist in der Datei header.html sollte ich auch ändern Sie den Namen der Vorlage ?
  • Wie nennt man Funcs() vor der Analyse ? Alle Beispiele, die ich fand, waren mit templates.New("").Funcs(...), aber hier meine Vorlagen sind bereits benannt, in Vorlagen, So kann ich nicht die Verwendung von Vorlagen.Neue(), kann ich das ? Was wäre die korrekte syntax dann ?
  • Sagen wir mal ich halte mich an die eingebaute eq-Funktion für jetzt. Ist die syntax meiner {{if}} - Anweisung korrekt ? Auch, wo finde ich die Dokumentation auf, dass .Active ? Kopiert habe ich es von hier, aber ich kann wirklich nichts finden, über die es in der offiziellen Vorlage doc.
  • Der Punkt . ist Ihre pipeline (auf der obersten Ebene, was auch immer Sie an die Execute*() Methoden, wie die Daten). Wenn .Active ist nicht gesetzt, das könnte schon das problem sein. Aber dies zeigt Sie nicht die überprüfung Ihrer Execute Fehler. Bitte zeigen Sie den code, wo Execute().
  • überprüfen Sie dies: play.golang.org/p/wr59HYR8gt
  • Ja, meine Funktion, wo templates ausgeführt werden, nicht auf Fehler überprüfen, denn ich "wollte nur testen etwas zu schnell". Fehler werde ich mich erinnern. Ich werde dieses Problem beheben und kommen zurück mit einem Fehler-log.
  • So, das ist mein error-log, und macht es mein Fehler, ganz klar : executing "header" at <.Active>: Active is not a field of struct type *main.Page . Ich dachte nur .Active war eine Art eingebaute, natürlich ist es nicht in der doc. Werde ich ersetzen .Aktiv mit einem Feld, das ich eigentlich haben, und kommen zurück, um Ihnen zu sagen, ob das funktioniert.
  • Und es funktioniert. Natürlich tut es das. Danke.
  • Es ist wie eine Menge, was du mir geschickt hast auf den Spielplatz, in die Ende. Danke auch an dich.
  • Eine weitere Sache : ich sollte schreiben Sie eine Antwort zusammenfassend meine Fehler, nur um tag die Frage als gelöst ?
  • Bitte nicht. Das ist schwer zu befolgen, sonst.
  • Nur um zu überprüfen: ist meine Antwort, die tun, was Sie wollen?
  • Ich denke, keine Notwendigkeit zum hinzufügen von FuncMap. Es gibt in-build-Funktion eq im html/template. Und was ist der Wert von .Active? Itmust ein string sein.

Schreibe einen Kommentar