Example below is a golang struct
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;}`);
}
Here is Javascript in golang template
<script>
$(function () {
console.log({{.Columns}}, wantedobj);
});
</script>
Here is chrome developer tools.
on render is there any posible way to get javascript function instead of string? (please see render at right picture)
Using template.JS is correct. Your problem is that in HTML templates, values are escaped based on contexts:
At parse time each {{.}} is overwritten to add escaping functions as necessary.
Inside <script> tags, struct values such as {{.Columns}} are rendered as JSON. Now, since template.JS is simply a defined type over string, when you marshal Columns as JSON, the field Render keeps its string representation.
If you print Render directly, it will appear as unquoted Javascript:
console.log({{.Columns.Render}}); // unescaped JS function
Now you might think of implementing MarshalJSON on Columns to render Render as unescaped Javascript, but that wouldn't be valid JSON anymore. Function is not a JSON data type. It can only be a string. An option is to use text/template package instead, but it won't escape anything anymore. Or construct the Javascript object using the single fields:
<script>
$(function () {
const foo = {
data: {{.Columns.Data}},
render: {{.Columns.Render}}
}
console.log(foo);
});
</script>