Heim > Backend-Entwicklung > Golang > Wie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage übergeben?

Wie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage übergeben?

Barbara Streisand
Freigeben: 2024-12-06 14:53:10
Original
462 Leute haben es durchsucht

How can I pass multiple values from a Go template to a nested template?

Mehrere Werte von Vorlage zu Vorlage übergeben

Beim Go-Templating ist es möglich, einen Datenwert an eine verschachtelte Vorlage zu übergeben, indem die {{ template}}-Aktion. Diese Aktion akzeptiert jedoch nur einen einzelnen Datenwert als Eingabe. Wenn mehrere Datenentitäten an eine verschachtelte Vorlage übergeben werden müssen, ist eine Lösung erforderlich.

Benutzerdefinierte Funktionen für die Datenverpackung

Das Vorlagensystem von Go ermöglicht die Registrierung benutzerdefinierter Funktionen mithilfe von Template.Funcs()-Methode. Diese Funktionen können Operationen an den Daten ausführen, bevor sie an die Vorlage übergeben werden, was eine Datenmanipulation und -paketierung ermöglicht.

Für den Fall, dass mehrere Werte an eine Vorlage übergeben werden müssen, kann eine benutzerdefinierte Funktion zum Umschließen erstellt werden diese Werte in eine einzige Entität, z. B. eine Karte oder Struktur. Diese verpackte Entität kann dann an die Aktion {{template}} übergeben werden.

Vorlagenänderung

Sobald die benutzerdefinierte Funktion definiert ist, kann die Vorlage zum Aufrufen geändert werden Führen Sie diese Funktion aus und übergeben Sie die umschlossene Datenentität an die verschachtelte Vorlage. Die Syntax hierfür lautet:

{{template "templateName" (customFunctionName data1 data2)}}
Nach dem Login kopieren

Beispiel

Berücksichtigen Sie die folgenden Stadt- und Regionsstrukturen:

type City struct {
    ID      int
    Name    string
    Regions []Region
}  

type Region struct {
    ID               int
    Name             string
    Shops            []Destination
    Masters          []Master
    EducationCenters []Destination
}
Nach dem Login kopieren

Um mehrere Datenentitäten zu übergeben Für eine verschachtelte Vorlage kann eine benutzerdefinierte Funktion Wrap() wie folgt definiert werden:

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}
Nach dem Login kopieren

Diese Funktion umschließt Die Geschäfte ordnen die Namen von Städten und Regionen auf einer Karte an. Die geänderte Vorlage würde nun so aussehen:

const src = `
{{define "data"}}
    City: {{.CityName}}, Region: {{.RegionName}}, Shops: {{.Shops}}
{{end}}
{{- range . -}}
        {{$city:=.Name}}
        {{- range .Regions -}}
              {{$region:=.Name}}
              {{- template "data" (Wrap .Shops $city $region) -}}
        {{end}}
{{- end}}`
Nach dem Login kopieren

Ausführbares Beispiel

Der folgende Code zeigt, wie diese Lösung in der Praxis eingesetzt werden kann:

package main

import (
    "os"
    "text/template"
)

type City struct {
    ID      int
    Name    string
    Regions []Region
}  

type Region struct {
    ID               int
    Name             string
    Shops            []Destination
    Masters          []Master
    EducationCenters []Destination
}

type Destination struct {
    Name string
}

func main() {
    t := template.Must(template.New("cities.gohtml").Funcs(template.FuncMap{
        "Wrap": Wrap,
    }).Parse(src))
    CityWithSomeData := []City{
        {
            Name: "CityA",
            Regions: []Region{
                {Name: "CA-RA", Shops: []Destination{{"CA-RA-SA"}, {"CA-RA-SB"}}},
                {Name: "CA-RB", Shops: []Destination{{"CA-RB-SA"}, {"CA-RB-SB"}}},
            },
        },
        {
            Name: "CityB",
            Regions: []Region{
                {Name: "CB-RA", Shops: []Destination{{"CB-RA-SA"}, {"CB-RA-SB"}}},
                {Name: "CB-RB", Shops: []Destination{{"CB-RB-SA"}, {"CB-RB-SB"}}},
            },
        },
    }
    if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil {
        panic(err)
    }
}

const src = `
{{define "data"}}
    City: {{.CityName}}, Region: {{.RegionName}}, Shops: {{.Shops}}
{{end}}
{{- range . -}}
        {{$city:=.Name}}
        {{- range .Regions -}}
              {{$region:=.Name}}
              {{- template "data" (Wrap .Shops $city $region) -}}
        {{end}}
{{- end}}`
Nach dem Login kopieren

Dieser Code demonstriert die erfolgreiche Übergabe mehrerer Datenentitäten an eine verschachtelte Vorlage mithilfe einer benutzerdefinierten Funktion.

Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage