7

在 Grails 中,基本上有 2 个地方可以定义 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 中,然后将它们粘合在一起,

有任何想法吗?

(编辑:这听起来像是动态生成 JavaScript 函数的一部分,然后下载一次并由客户端一遍又一遍地使用的想法,这是一个坏主意。但是,“动态”部分只会改变也许每周或每月一次,然后很少。大多数情况下,我们只希望从数据库中生成这个片段,即使只有一次,而不是硬编码。)

4

6 回答 6

13

保持 JavaScript 不显眼的一个简单解决方案是创建一个 JavaScriptController 并通过将其添加到UrlMappings.groovy文件中来映射其操作“/js/*”:

"/js/$action"{
  controller = "javascript"
}

然后只需为您想要的每个动态 JS 文件创建一个动作,将其包含在您的布局 <HEAD> 中,然后,您就有了一个可以插入 Grails 片段的 JS 文件!:)

注意:我发现 Grails 目前存在一个错误,它不能正确地将文件扩展名映射到内容类型,因此您需要<%@ page contentType="text/javascript; UTF-8" %>在视图文件的顶部包含。

于 2009-01-08T20:03:15.173 回答
7

这是一个很好的解决方案。我想提供一个建议来使用除映射之外的其他东西

“/js/$动作”
因为这将不再允许您访问 /web-app/js/ 中的 javascript 文件。您的所有 javascript 文件都必须移动到控制器指向的目录中。

我会使用类似的东西

“/dynjs/$动作”

这样,您仍然可以指向 /web-app/js/ 文件中的文件而不会发生冲突,并享受 javascript 文件中 gsp 标签的好处

如果我错了,请纠正我。

于 2009-05-15T18:59:11.367 回答
1

或者这个......有一个标签/服务/动态方法,让标签写出他们的 JS+CSS+其他任何东西,到一个“缓存”,用于由不同的控制器构建 JS+CSS 资源。

完整的概念在这里:[ http://www.anyware.co.uk/2005/2009/01/19/an-idea-to-give-grails-tags-esp/][1]

于 2009-01-22T15:23:09.893 回答
1

如果您想在 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 等。

于 2011-01-14T18:33:00.117 回答
1

像这样命名你的脚本

/wherever/the/js/files/are/thescript.js.gsp

里面的gsp代码会被grails正确渲染。这行得通,但我不知道它是否被认为是一个好主意。

于 2011-02-15T19:56:32.137 回答
0

还有另一种方法 - 将生成的代码传递到需要闭包的函数中。这些闭包当然是由程序生成的。生成的代码当然是在 gsp 页面中内联/脚本标记的。

它可能会或可能不会工作,具体取决于生成的代码的性质。但我怀疑它会起作用,如果它不起作用,对你的 javascript 的编码风格进行细微的调整肯定会让它起作用。不过,如果这些“生成”的代码没有太大变化,这在 imo 中就显得有点矫枉过正了。

于 2009-01-09T16:25:46.977 回答