【问题标题】:Access out of loop value inside golang template's loop访问golang模板循环内的循环外值
【发布时间】:2013-05-20 00:39:33
【问题描述】:

我有这个结构:

type Site struct {
    Name string
    Pages []int
}

我将Site 的实例传递给template

如果我想写一个所有页面的列表,我会这样做

{{range .Pages}}
    <li><a href="{{.}}">{{.}}</a></li>
{{end}}

现在,在循环中使用Name 字段的最简单方法是什么(例如将href 更改为Name/page)?

请注意,基于外部对象是传递给模板的全局对象这一事实的解决方案是可以的。

【问题讨论】:

    标签: templates go


    【解决方案1】:

    你应该知道传入模板的变量是$

    {{range .Pages}}
        <li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
    {{end}}
    

    (请参阅“变量”下的text/template 文档。)

    【讨论】:

    • 如果我有一个全局变量 123 并且在一个范围内我试图使用该范围的 id 作为全局变量怎么办?如此混乱......但我怎么能这样做呢?我尝试了以下方法,但效果不佳...pastebin.com/iAUtiLMq
    【解决方案2】:

    怎么样:

    {{$name := .Name}}
    {{range $page := .Pages}}
        <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
    {{end}}
    

    或者干脆将Pages 制作为以名称为值的地图?

    type Site struct {
        Pages map[string]string
    }
    
    
    {{range $page, $name := .Pages}}
        <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
    {{end}}
    

    【讨论】:

    • 第一个解决方案和我的差不多。第二个不适合:名称不是页面的名称,而是站点的名称。
    【解决方案3】:

    似乎没有比为外部对象(或其属性)显式声明变量更简单的解决方案了:

    {{$out := .}}
    {{range .Pages}}
        <li><a href="{{$out.Name}}/{{.}}">{{.}}</a></li>
    {{end}}
    

    编辑:这个答案不再正确了,看看 chowey 的答案吧。

    【讨论】:

    • 这没有什么可笑的。我以前做过。它做它所说的。清晰 > 简洁。
    • @JimPaek 传递给模板的对象没有快捷方式?
    • 对不起,我想我错了。您可以执行以下操作: range $index, $page := .Pages 然后我相信“。”仍然是模板的原始管道。编辑:待测试
    • @JimPaek 它不起作用:您可以像这样声明变量,但{{.}} 仍然是迭代值(即它等于$page)和{{.Name}} 因此制作了一个模板错误。
    • @bfrederi 注意 OP 也是这里的回答者;)
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多