在 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> 不起作用

Grails - 更改 javascript 后重新部署

AJAX 将 JSON 数据从 Javascript 发布到 Grails

Grails:如何将 javascript/ajax 放入 taglib 中?

如何在 JavaScript 中访问 Grails 变量?

哪个可用于 JavaScript 和 Grails/Java 的可互操作模板框架?