【问题标题】:Is it posible to return javascript function from golang struct?是否可以从 golang 结构返回 javascript 函数?
【发布时间】:2022-01-19 00:28:42
【问题描述】:

下面的例子是一个 golang 结构

type Column struct {
        Data            string      `json:"data"`
        Title           string      `json:"title"`
        Type            string      `json:"type"`
        Class           string      `json:"class"`
        Visible         bool        `json:"visible"`
        Render          template.JS `json:"render"`
}

func (c *Column) SetValue() {
        // code below is flexible depend on condition but here i keep it simple.
        c.Render = template.JS(`function(data, type, row) { if(type === 'display'){ return $.fn.dataTable.render.text().display(data);} return data;}`);
}

这里是 golang 模板中的 Javascript

<script>
    $(function () {
        console.log({{.Columns}}, wantedobj);
    });
</script>

这里是 chrome 开发者工具。

  • 左列表是来自上述结构的格式值。
  • 正确的列表是我想要的格式。

关于 render 是否有任何可能的方法来获取 javascript 函数而不是字符串? (请看右图的渲染

【问题讨论】:

    标签: javascript function go struct


    【解决方案1】:

    使用template.JS 是正确的。您的问题是,在 HTML 模板中,值是根据 contexts 转义的:

    在解析时,每个 {{.}} 都会被覆盖以根据需要添加转义函数。

    &lt;script&gt; 标签内,{{.Columns}} 等结构值被渲染为 JSON。现在,由于template.JS 只是在string 上定义的类型,所以当您将Columns 编组为JSON 时,Render 字段将保留其字符串表示形式。

    如果您直接打印Render,它将显示为未引用的Javascript:

    console.log({{.Columns.Render}}); // unescaped JS function
    

    现在您可能会考虑在Columns 上实现MarshalJSON 以将Render 呈现为未转义的Javascript,但这将不再是有效的JSON。函数不是 JSON 数据类型。它只能是一个字符串。一种选择是改用 text/template 包,但它不会再逃避 anything 了。或者使用单个字段构造 Javascript 对象:

    <script>
        $(function () {
            const foo = {
                data: {{.Columns.Data}},
                render: {{.Columns.Render}}
            }
            console.log(foo);
        });
    </script>
    

    【讨论】:

    • 这是一个很好的答案,但我建议不要使用模板将数据传递给 JavaScript,NightOwl。很难正确地进行转义,也很难调试。我更喜欢编写静态 javascript 并使用 API 调用从后端提取数据。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多