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)}}
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 }
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, } }
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}}`
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}}`
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!