Maison > développement back-end > Golang > Comment puis-je transmettre plusieurs valeurs d'un modèle Go à un modèle imbriqué ?

Comment puis-je transmettre plusieurs valeurs d'un modèle Go à un modèle imbriqué ?

Barbara Streisand
Libérer: 2024-12-06 14:53:10
original
517 Les gens l'ont consulté

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

Passer plusieurs valeurs d'un modèle à l'autre

Dans les modèles Go, il est possible de transmettre une valeur de données à un modèle imbriqué à l'aide du {{ modèle}} action. Cependant, cette action n’accepte qu’une seule valeur de données en entrée. Lorsque plusieurs entités de données doivent être transmises à un modèle imbriqué, une solution est requise.

Fonctions personnalisées pour le packaging des données

Le système de modèles de Go permet d'enregistrer des fonctions personnalisées à l'aide du Méthode Template.Funcs(). Ces fonctions peuvent effectuer des opérations sur les données avant qu'elles ne soient transmises au modèle, permettant ainsi la manipulation et le conditionnement des données.

Dans le cas où plusieurs valeurs doivent être transmises à un modèle, une fonction personnalisée peut être créée pour envelopper ces valeurs en une seule entité, comme une carte ou une structure. Cette entité encapsulée peut ensuite être transmise à l'action {{template}}.

Modification du modèle

Une fois la fonction personnalisée définie, le modèle peut être modifié pour appeler cette fonction et transmettez l'entité de données encapsulée au modèle imbriqué. La syntaxe pour cela est :

{{template "templateName" (customFunctionName data1 data2)}}
Copier après la connexion

Exemple

Considérez les structures Ville et Région suivantes :

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

type Region struct {
    ID               int
    Name             string
    Shops            []Destination
    Masters          []Master
    EducationCenters []Destination
}
Copier après la connexion

Pour transmettre plusieurs entités de données à un modèle imbriqué, une fonction personnalisée Wrap() peut être définie comme suit :

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}
Copier après la connexion

Cette fonction enveloppe les magasins sont classés ainsi que les noms de villes et de régions sur une carte. Le modèle modifié ressemblerait maintenant à ceci :

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}}`
Copier après la connexion

Exemple exécutable

Le code suivant montre comment cette solution peut être utilisée dans la pratique :

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}}`
Copier après la connexion

Ce code démontre le passage réussi de plusieurs entités de données à un modèle imbriqué à l'aide d'une fonction personnalisée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal