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

我正在尝试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 }}


拉莫斯之舞
浏览 396回答 2
2回答

摇曳的蔷薇

你不能用当前的 go 模板包做你想做的事。模板没有继承,因此没有模板中的命名块。与定义基本模板不同,定义页眉和页脚模板更为常见。然后,在您的页面模板中,明确包含您希望它们去的地方。我相信,另一种解决方案是使用 2 阶段模板阶段。第一种方法是为基本模板的所有块编译模板。这些被添加到地图中,然后发送到基础模板以供包含。

交互式爱情

这很不明显,我不知道他们为什么这样做ParseGlob 返回一个您丢弃的值,但您需要保留它;它是您需要调用的模板对象,因此您的代码应如下所示:func init() {&nbsp; fmt.Println("Starting up.")&nbsp; t, err := template.ParseGlob("templates/*.tmpl")&nbsp; if err != nil {&nbsp; &nbsp; log.Fatal("Error loading templates:" + err.Error())&nbsp; }}该方法的文档(与上面使用的库函数相反)有点不清楚,因为它说它将模板与调用该方法的模板对象相关联,但它也返回一个指向模板对象的指针,如果它像宣传的那样工作,则不需要这样做。乐趣!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go