我希望直接在视图中通过嵌入数据将数据从控制器传递到javascript。 (因此不会有其他请求。)
我的第一个解决方案是在GSP中使用as JSON
,如下所示:
<script>
var data = ${invoice as JSON};
</script>
我不认为这是个好主意,因为我必须使用(Grails 2.2)
grails.views.default.codec = "none"
或(Grails 2.3)
grails {
views {
gsp {
codecs {
expression = 'none'
}
}
}
}
现在,我发现我可以创建这样的小标记:
def json = { attrs, body ->
out << (attrs.model as JSON)
}
我可以在GSP中使用以下代码:
<script>
var data = <g:json model="${invoice}" />;
</script>
现在,问题。使用taglib是最佳做法吗?如果没有,请给我最好的解决方案。
答案 0 :(得分:3)
在回答中转换评论。您可以在控制器中创建JSON字符串并将其传递给视图。 Grails 2.3.x具有不对您的内容进行编码的原始编解码器。有关此编解码器的更多信息here。
示例:
class MyController {
def index() {
String invoiceString = invoice as JSON
[json: invoiceString]
}
}
index.gsp中
<script>
var data = ${raw(json)};
</script>
答案 1 :(得分:2)
使用grails 2.4.4。
以上回答对我没有用。
所以添加对我有用的东西。
来源: http://aruizca.com/how-to-render-json-properly-without-escaping-quotes-inside-a-gsp-script-tag/
<g:applyCodec encodeAs="none">
var data = ${data};
</g:applyCodec>
答案 2 :(得分:1)
现在,我正在升级到Grails 3.2.4。我发现塞尔吉奥·米歇尔斯的方法仍然有用。只需确保jsonString
是String
对象。
<script>
var data = ${raw(jsonString)};
</script>
如果它不是String
对象,您可以使用类似下面的代码。
<script>
var data = ${raw(mapInstance.encodeAsJSON().toString)};
</script>