【问题标题】:How to access a variable across all js files of an HTML go-gin如何在 HTML go-gin 的所有 js 文件中访问变量
【发布时间】:2016-08-26 07:13:13
【问题描述】:

我正在使用 gin 模板并呈现我使用的 HTML

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

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

【问题讨论】:

    标签: javascript html go go-templates


    【解决方案1】:

    您可以在创建 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代码编写的方式,但是在插入{{.counter}} 的结果时没有添加引号,因为它是一个值类型为int

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

    还可以查看这个相关问题:Referencing Go array in Javascript

    【讨论】:

    • 我们真的需要使用 Template.Execute()。我们不能像使用 c.HTML 那样传递变量吗?我仍然可以以{{.username}} 的身份访问这些变量。我不能像你一样将它们存储为全局变量吗?
    • @love2code 你不需要使用它,你可以使用 c.HTML() 传递它们。我使用了Template.Execute(),以便它可以在Go Playground 上运行,因为github.com/gin-gonic/gin 包不能在那里导入。创建和初始化 Javascript 变量的原则是最重要的,剩下的就是让它可以在 Go Playground 上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多