return javascript 函数可以从 golang 结构中调用吗?

Is it posible to return javascript function from golang struct?

下面的例子是一个 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 开发者工具。

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

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

转义的

At parse time each {{.}} is overwritten to add escaping functions as necessary.

<script> 标签内,{{.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>