如何在HTML go-gin的所有js文件中访问变量

时间:2016-08-26 07:13:14

标签: javascript html go go-templates

我正在使用gin模板并渲染我使用的HTML

c.Writer.Header().Set("username", "myname")
c.HTML(200, "myservices", gin.H{
    "title":    "Dashboard",
    "username": "myname" })

我想传递一个变量(用户名),以便我可以在附加到我模板的js文件中访问它。我可以使用{{.username}}访问模板中的用户名变量。如何使它成为全局的,以便我也可以在所有js文件中访问它。我尝试在标题中设置它,但我只能在加载HTML时访问它。在加载模板之前,我将无法使用它。

1 个答案:

答案 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