【问题标题】:go template - nested templatedgo template - 嵌套模板
【发布时间】:2020-02-17 14:19:22
【问题描述】:

我有几个 go 模板。下面的例子过于简单,但它正确地说明了我的想法。例如,我有

{{ define "div-block" }}
   <div style="display:block">
         .....
   </div>
{{ end }}

现在我想在使用 div-block 时转移任何其他模板,这样我就可以在 div 中放入任何东西。例如:

{{ template "div-block" . }}
    {{ template "header" }}
{{ end }}

{{ template "div-block" . }}
    <ul>
       <li>1</li>
    </ul>
{{ end }}

“header”是其他模板。

使用 go 模板执行此操作的正确方法是什么?是否可以使用自定义功能来做到这一点?是否可以在 go 模板中自定义 actions? (动作可以有end 语句和主体,而函数则没有)

【问题讨论】:

  • 如何将div-block 拆分为开放标签和结束标签?喜欢{{ template "div-begin" . }} something {{template "div-end" . }}
  • 这是一个很好的观点,谢谢。但是,如果有更多变体,问题仍然存在

标签: go go-templates


【解决方案1】:

你可以在go模板中使用嵌套模板。

divBlock := `<div>Hello div
                {{block "header" .}} {{.}} {{end}}
             </div>`
header := `<header>Hello Header</header>`

divTempl, err := template.New("master").Parse(divBlock)
if err != nil {
    log.Fatal(err)
}
if err := divTempl.Execute(os.Stdout, header); err != nil {
    log.Fatal(err)
}

去游乐场链接:https://play.golang.org/p/K36l3bn5753

或者

您可以使用 if 语句。检查是否有模板,然后追加,否则为空。

const (
    divBlock = `<div style="display:block">
                 .....
            {{if "injectedTmpl"}}{{.}}{{end}}
           </div>`
)   
injectedTmpl := `<header>Hello Header</header>`

divTmpl, err := template.New("div").Parse(divBlock)
if err != nil {
    log.Fatal(err)
}
if err := divTmpl.Execute(os.Stdout, injectedTmpl); err != nil {
    log.Fatal(err)
}

去游乐场链接:https://play.golang.org/p/pZaqXtCHHAL

【讨论】:

    【解决方案2】:

    在外部定义另一个模板,并在 div-block 模板中使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多