如何将多个值从模板传递到模板?

Posted

技术标签:

【中文标题】如何将多个值从模板传递到模板?【英文标题】:How to pass multiple values from template to template? 【发布时间】:2018-09-03 12:28:43 【问题描述】:

我的City 结构是这样的:

type City struct 
    ID      int
    Name    string
    Regions []Region
  

Region 结构是:

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

我主要尝试这样做:

tpl.ExecuteTemplate(resWriter,"cities.gohtml",CityWithSomeData)

是否可以在模板中执行类似的操作?

range .
        $city:=.Name
            range .Regions
                      $region:=.Name
                      template "data" .Shops $city $region
            end
end

【问题讨论】:

***.com/questions/18276173/…的可能重复 【参考方案1】:

我猜CityWithSomeData 是一个切片,如果是这样尝试一下:

type viewModel struct 
    List   []City

然后,在您的模板中:

range .List
        $city:=.Name
            range .Regions
                      $region:=.Name
                      template "data" .Shops $city $region
            end
end

【讨论】:

City 是如上所示的结构。我想知道如何在data 模板中访问这些$city$region 变量【参考方案2】:

引用text/template 的文档,template 操作的语法:

template "name"
    The template with the specified name is executed with nil data.

template "name" pipeline
    The template with the specified name is executed with dot set
    to the value of the pipeline.

这意味着您可以将一个可选数据传递给模板执行,而不是更多。如果要传递多个值,则必须将它们包装成您传递的某个值。详情见How to pass multiple data to Go template?

所以我们应该将这些数据包装到结构或映射中。但是我们不能在模板中编写 Go 代码。我们可以做的是注册一个函数,我们将这些数据传递给该函数,该函数可以进行“打包”并返回一个值,现在我们可以将其传递给template 操作。

这是一个示例包装器,它简单地将这些包装到地图中:

func Wrap(shops []Destination, cityName, regionName string) map[string]interface 
    return map[string]interface
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    

可以使用Template.Funcs() 方法注册自定义函数,别忘了在解析模板文本之前必须这样做。

这是一个修改过的模板,它调用这个Wrap() 函数来产生一个值:

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`

下面是一个可运行的示例,展示了这些操作:

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)

输出(在Go Playground 上试试):

City: CityA, Region: CA-RA, Shops: [CA-RA-SA CA-RA-SB]

City: CityA, Region: CA-RB, Shops: [CA-RB-SA CA-RB-SB]

City: CityB, Region: CB-RA, Shops: [CB-RA-SA CB-RA-SB]

City: CityB, Region: CB-RB, Shops: [CB-RB-SA CB-RB-SB]

【讨论】:

这是我所期望的。谢谢

以上是关于如何将多个值从模板传递到模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从模板传递到 ts 函数

如何将 observable 的值从服务传递到组件以更新模板

如何将值从 django 模板化 html 传递到 ajax

如何将变量的值从一个 div 传递到同一模板中的另一个 div?

如何将值从Django模板传递给View

如何将值从 get_queryset() 传递到 get_context_data()