Golang模板间传递多个参数的实现方法

Golang模板间传递多个参数的实现方法 我有几个使用 Go HTML 模板的页面(没有从 Go 传递任何参数)。

主模板应该传递两个字符串参数给下一个模板。

{{template "httpend" "main" "sub"}}

另一个包含脚本的模板应该能够接收这些参数并触发一个 JavaScript 函数。

{{define "httpend"}}

<script src="/js/menu.js" defer></script>
<script src="/js/nav.js" defer></script>
<script>
    window.onload = function() {
      fillsubmenu({{.}},{{.}})
    }
</script>

{{end}}

这样做的目的是使其更符合 DRY 原则。在每个页面上重复脚本会难以维护。

没有从 Go 传递点参数(.main .sub)。只是纯字符串…

没有报告错误,但 httpend 模板由于某种原因没有显示。因此也没有被触发。

我如何将多个字符串作为参数传递给另一个 Go HTML 模板?


更多关于Golang模板间传递多个参数的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

不,是模板语法和系统。

更多关于Golang模板间传递多个参数的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


NobbZ:

使用结构体或映射上下文,并使用适当的名称来创建和访问。

使用 HTML?

使用结构体或映射作为上下文,并使用适当的名称来创建和访问。

单个模板中不能有多个上下文或“参数”。

在Go模板中传递多个参数的正确方法是使用{{template}}动作的变体形式。以下是实现方法:

{{define "main"}}
<!DOCTYPE html>
<html>
<body>
    <!-- 传递多个参数的正确语法 -->
    {{template "httpend" (dict "param1" "main" "param2" "sub")}}
</body>
</html>
{{end}}

{{define "httpend"}}
<script src="/js/menu.js" defer></script>
<script src="/js/nav.js" defer></script>
<script>
    window.onload = function() {
        // 访问传递的参数
        fillsubmenu("{{.param1}}", "{{.param2}}")
    }
</script>
{{end}}

或者使用slice传递参数:

{{define "main"}}
<!DOCTYPE html>
<html>
<body>
    <!-- 使用slice传递多个值 -->
    {{template "httpend" (slice "main" "sub")}}
</body>
</html>
{{end}}

{{define "httpend"}}
<script src="/js/menu.js" defer></script>
<script src="/js/nav.js" defer></script>
<script>
    window.onload = function() {
        // 通过索引访问slice元素
        fillsubmenu("{{index . 0}}", "{{index . 1}}")
    }
</script>
{{end}}

对于更复杂的情况,可以创建自定义数据结构:

{{define "main"}}
<!DOCTYPE html>
<html>
<body>
    <!-- 传递结构化的数据 -->
    {{template "httpend" (map "menu" "main" "submenu" "sub" "active" true)}}
</body>
</html>
{{end}}

{{define "httpend"}}
<script src="/js/menu.js" defer></script>
<script src="/js/nav.js" defer></script>
<script>
    window.onload = function() {
        fillsubmenu("{{.menu}}", "{{.submenu}}")
        {{if .active}}activateMenu();{{end}}
    }
</script>
{{end}}

在Go代码中渲染模板的示例:

func handler(w http.ResponseWriter, r *http.Request) {
    tmpl := template.Must(template.ParseFiles("layout.html", "httpend.html"))
    
    // 如果需要从Go传递数据
    data := struct {
        Title string
        Menu  string
    }{
        Title: "My Page",
        Menu:  "main",
    }
    
    tmpl.ExecuteTemplate(w, "layout", data)
}

关键点:

  1. 使用dictslicemap函数包装多个参数
  2. 在子模板中通过键名或索引访问参数
  3. 确保模板文件被正确解析和包含
回到顶部