为了账号安全,请及时绑定邮箱和手机立即绑定

Go - html/template、template.ParseGlob() 和代码重用

Go - html/template、template.ParseGlob() 和代码重用

Go
拉莫斯之舞 2021-06-29 13:31:27
我正在尝试html/template在 Go 中使用嵌入模板。我非常喜欢无逻辑模板设计,我相信它能够按预期安全地转义(有时其他模板库会出错)。但是,我在尝试实现一个小助手以根据“最终”模板名称在我的 HTTP 处理程序中呈现我的模板时遇到了一些问题。我的 base.tmpl 在我的所有页面中都是有效的“标准”,如果不是,我可以{{ template checkoutJS }}在 base.tmpl 中设置并通过设置添加一些每页 JS {{ define checkoutJS }}https://path.to/extra.js {{ end }}。我希望能够renderTemplate(w, "template_name.tmpl", data)在我的 HTTP 处理程序中说,data包含字符串或结构的 map[string]interface{}在哪里,我想填写任何内容。这是到目前为止的代码:基础文件{{ define "base" }}<!DOCTYPE html><html><head><title>{{ template "title" . }}</title></head><body><div id="sidebar">...</div>{{ template "content" }}<div id="footer">...</div></body></html>create_listing.tmpl{{ define "title" }}Create a New Listing{{ end }}{{ define "content" }}<form>  ...</form>{{ end }}login_form.tmpl{{ define "title" }}Login{{ end }}{{ define "content" }}<form>  ...</form>{{ end }}
查看完整描述

2 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你不能用当前的 go 模板包做你想做的事。模板没有继承,因此没有模板中的命名块。与定义基本模板不同,定义页眉和页脚模板更为常见。然后,在您的页面模板中,明确包含您希望它们去的地方。

我相信,另一种解决方案是使用 2 阶段模板阶段。第一种方法是为基本模板的所有块编译模板。这些被添加到地图中,然后发送到基础模板以供包含。


查看完整回答
反对 回复 2021-07-05
?
交互式爱情

TA贡献1712条经验 获得超3个赞

这很不明显,我不知道他们为什么这样做


ParseGlob 返回一个您丢弃的值,但您需要保留它;它是您需要调用的模板对象,因此您的代码应如下所示:


func init() {

  fmt.Println("Starting up.")

  t, err := template.ParseGlob("templates/*.tmpl")

  if err != nil {

    log.Fatal("Error loading templates:" + err.Error())

  }

}

该方法的文档(与上面使用的库函数相反)有点不清楚,因为它说它将模板与调用该方法的模板对象相关联,但它也返回一个指向模板对象的指针,如果它像宣传的那样工作,则不需要这样做。乐趣!


查看完整回答
反对 回复 2021-07-05
  • 2 回答
  • 0 关注
  • 391 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信