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>
下面的例子是一个 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>