我正在使用gin模板并渲染我使用的HTML
c.Writer.Header().Set("username", "myname")
c.HTML(200, "myservices", gin.H{
"title": "Dashboard",
"username": "myname" })
我想传递一个变量(用户名),以便我可以在附加到我模板的js文件中访问它。我可以使用{{.username}}
访问模板中的用户名变量。如何使它成为全局的,以便我也可以在所有js文件中访问它。我尝试在标题中设置它,但我只能在加载HTML时访问它。在加载模板之前,我将无法使用它。
答案 0 :(得分:2)
您可以将Javascript代码插入到创建Javascript变量的HTML页面(例如<head>
部分)中,并使用传递给模板执行的参数初始化它们。
见这个例子:
func main() {
t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{
"title": "Test page",
"username": "bob",
"counter": 12,
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `<html><head>
<script>
var _title = {{.title}};
var _username = {{.username}};
var _counter = {{.counter}};
</script>
</head><body>
</body>
</html>`
这会产生一个HTML文档(在Go Playground上尝试):
<html><head>
<script>
var _title = "Test page";
var _username = "bob";
var _counter = 12 ;
</script>
</head><body>
</body>
</html>
这意味着页面中的其他Javascript代码(内联或引用,外部)将看到变量_title
,_username
,_counter
并将它们用作常规变量,并使用我们传递给Template.Execute()
的值初始化它们。
请注意,html/template
包执行上下文转义。看到它将{{.title}}
的结果插入引号,因为它是string
,这是应该如何用Javascript代码编写的,但是在插入{{.counter}}
的结果时没有添加引号,因为它是int
类型的值。
另请注意,您应使用唯一的命名策略,以避免与可能在其他Javascript代码中使用的现有变量或变量发生冲突。通常一个特殊的前缀(或后缀)就可以了。
另请查看此相关问题:Referencing Go array in Javascript