在 Grails 的 JavaScript 源代码中执行 groovy 语句
Posted
技术标签:
【中文标题】在 Grails 的 JavaScript 源代码中执行 groovy 语句【英文标题】:Executing groovy statements in JavaScript sources in Grails 【发布时间】:2010-09-30 08:24:20 【问题描述】:在 Grails 中基本上有两个地方可以定义 javascript 函数,直接在 GSP 上的一个元素中,以及在 /web-app/js 下的一个单独的 JavaScript 源文件中(例如,application.js)。我们在 application.js 中定义了一个常用的 javascript 函数,但我们还需要能够使用 groovy 代码动态生成函数的一部分。不幸的是,$some groovy code 似乎没有在单独的 javascript 源文件中进行处理。
是通过在 GSP 页面上的脚本标记中定义 javascript 函数来做到这一点的唯一方法,还是有更通用的解决方案?显然,我们可以在模板 GSP 文件中的脚本标记中定义 javascript 函数,该文件将被重用,但是有很多努力将我们的 javascript 函数一起定义在一个地方(即外部 javascript 源文件)。这也有性能优势(javascript 源文件通常只由每个客户端的浏览器下载一次,而不是在他们访问的每个 html 页面的源中重新加载相同的 javascript 函数)。我玩弄了将函数分解为静态和动态部分的想法,将静态部分放在外部源中,将动态部分放在模板 GSP 中,然后将它们粘合在一起,但这似乎是不必要的 hack。
有什么想法吗?
(编辑:这听起来像是动态生成 JavaScript 函数的一部分,然后下载一次并由客户端反复使用的想法,这不是一个好主意。但是,“动态" 可能每周或每月只更改一次,然后只是非常轻微。大多数情况下,我们只希望从数据库生成这部分,即使只有一次,而不是硬编码。)
【问题讨论】:
【参考方案1】:让您的 JavaScript 不显眼的一个简单解决方案是创建一个 JavaScriptController 并通过将其添加到您的 UrlMappings.groovy
文件来映射其操作“/js/*”:
"/js/$action"
controller = "javascript"
然后只需为您想要的每个动态 JS 文件创建一个动作,将其包含在您的布局
中,然后,您就有了一个可以将 Grails sn-ps 插入的 JS 文件! :)注意:我发现目前 Grails 中存在一个错误,它不能正确地将文件扩展名映射到内容类型,因此您需要在顶部包含 <%@ page contentType="text/javascript; UTF-8" %>
您的视图文件。
【讨论】:
不客气!上周我遇到了类似的问题,除了我正在处理 CSS 文件:)【参考方案2】:这是一个很好的解决方案。我想提出一个建议,以使用
映射以外的其他东西"/js/$action"因为这将不再允许您访问 /web-app/js/ 中的 javascript 文件。您的所有 javascript 文件都必须移动到您的控制器指向的目录中。
我会使用类似的东西
"/dynjs/$action"
这样你仍然可以无冲突地指向 /web-app/js/ 文件中的文件,并享受 javascript 文件中 gsp 标签的好处
如果我错了,请纠正我。
【讨论】:
我会将此添加为评论,但我的声誉目前低于 50,因此我无法评论其他人的答案 好点。但是请记住,您不必为“/js/$action”创建完整的 url 映射,并且可以直接指定单个操作,即“/js/dyn.js”【参考方案3】:或者这个...有一个标签/服务/动态方法,让标签写出他们的 JS+CSS+其他任何东西,到一个“缓存”,由不同的控制器用来构建 JS+CSS 资源。
这里有完整的概念:[http://www.anyware.co.uk/2005/2009/01/19/an-idea-to-give-grails-tags-esp/][1]
【讨论】:
【参考方案4】:如果您想在 Javascript 代码中使用由控制器创建的模型(即渲染的 HTML 页面,该页面引用您打算在其中使用 groovy 代码的 Javascript),那么您可以使用这种技术:
此技术不需要更改 URL 映射,也不需要您创建额外的控制器。
在您看来 GSP 添加 javascript 如下:
<script type="text/javascript">
<g:render template="/javascript/yourJavascriptFile"/>
</script>
在视图文件夹中创建一个“javascript”文件夹。并创建一个名为: _yourJavascriptFile.gsp
您不仅可以使用 _yourJavascriptFile.gsp 文件中的所有 GSP 代码,还可以使用在控制器中创建的所有模型(即渲染视图)。
注意:javascript 文件夹没有什么特别之处。您可以将其命名为任何您想要的名称或使用现有的视图文件夹。这只是组织和识别您的 HTML spitting GSP 和 Javascript spitting GSP 的问题。或者,您可以使用一些命名约定,例如:_something.js.gsp 等。
【讨论】:
【参考方案5】:这样命名你的脚本
/wherever/the/js/files/are/thescript.js.gsp
里面的gsp代码会被grails正确渲染。这行得通,但我不知道它是否被认为是一个好主意。
【讨论】:
【参考方案6】:还有另一种方法 - 将生成的代码传递到需要闭包的函数中。这些闭包当然是由程序生成的。生成的代码当然是在 gsp 页面中内联/脚本标记的。
它可能会或可能不会工作,具体取决于生成的代码的性质。但我怀疑它会起作用,如果它不起作用,对你的 javascript 的编码风格进行细微的调整肯定会让它起作用。但是,如果这些“生成”的代码没有太大变化,这在 imo 中就显得有点矫枉过正了。
【讨论】:
以上是关于在 Grails 的 JavaScript 源代码中执行 groovy 语句的主要内容,如果未能解决你的问题,请参考以下文章
grails 2.0 <g:javascript> 不起作用
AJAX 将 JSON 数据从 Javascript 发布到 Grails