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

How to access a variable across all js files of an HTML go-gin

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

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

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

您可以在创建 Javascript 变量的 HTML 页面(例如 <head> 部分)插入 Javascript 代码,并使用参数初始化它们传递给模板执行。

看这个例子:

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 代码中,但是在插入 [ 的结果时没有添加引号=20=],因为它是 int.

类型的值

另请注意,您应该使用独特的命名策略,以避免与现有变量或可能在其他 Javascript 代码中使用的变量发生冲突。通常是一个特殊的前缀(或后缀)。

另请查看此相关问题:Referencing Go array in Javascript