2009-01-08 50 views
7

基本上有2个地方,以限定JavaScript函数Grails中,直接在所述GSP一个元件,而根据/ web应用/ JS一个单独的JavaScript源文件中(例如,应用.js文件)。我们已经在application.js中定义了一个常用的javascript函数,但我们也需要能够使用groovy代码动态生成部分函数。不幸的是,$ {一些groovy代码}似乎没有在单独的javascript源文件中处理。执行在JavaScript源常规语句Grails中

是通过GSP网页上的脚本标签中定义的JavaScript函数来做到这一点的唯一方法,还是有一个较全面的解决?很显然,我们可以在模板GSP文件中的脚本标签中定义javascript函数,这个模板可以被重用,但是为了让我们的JavaScript函数在一个地方(即外部javascript源文件)中一起定义,我们需要进行大量的推动。这也具有性能优势(JavaScript源文件通常仅由每个客户端的浏览器下载一次,而不是在他们访问的每个html页面的源内重新加载相同的javascript函数)。我已经玩弄了将功能分解为静态和动态片断的想法,将静态片断放在外部源中,并将动态片断放入模板GSP中,然后将它们粘合在一起,但这似乎是不必要的破解。

任何想法? (编辑:这听起来像是动态生成JavaScript函数的一部分,然后下载一次并被客户反复使用的想法,这可能是一个坏主意,但是,这是一个“动态”只改变一个星期或一个月也许一次,然后只有非常轻微的。主要是我们只是想产生这块关闭数据库,哪怕只有一次,而不是硬编码。)

回答

13

一个简单的解决方案,让您的JavaScript不显眼的是创建一个JavaScriptController和映射其行为“/ JS/*”,加入这个您UrlMappings.groovy文件:

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

然后只需要为每个你想要的动态JS文件创建一个动作,包含在你的布局<HEAD>中,并且还有一个JS文件,你可以插入Grails代码片段! :)

注:我发现,有目前在不文件扩展名的内容类型正确映射Grails的一个bug,所以你需要包括<%@ page contentType="text/javascript; UTF-8" %>在你的视图文件的顶部。

+0

非常聪明,谢谢 – 2009-01-08 20:44:16

+0

非常欢迎!我上周遇到类似的问题,除了我正在处理CSS文件:) – gabriel 2009-01-08 20:59:32

0

还有另一种方法 - 通过在所生成的代码到一个期望封闭件的功能。那些关闭是由程序产生的。生成的代码当然是在gsp页面中内联/脚本标记的。

它可以或可以不依赖于代码的性质工作的产生。但我怀疑它会起作用,如果它没有,对JavaScript的编码风格进行微小的调整肯定会使它工作。但是,如果这些'生成'的代码没有太大的改变,这相当矫枉过正。

7

这是一个很好的解决方案。我想提供一个建议,使用其他映射

"/js/$action"
之外的东西,因为这将不再允许您访问您在/ web-app/js /中的JavaScript文件。所有的JavaScript文件都必须移动到控制器指向的目录中。

我会使用类似

"/dynjs/$action"

这样你仍然可以指向同出冲突/ web应用/ JS /文件档案,享受GSP标签的典型应用该类超支的JavaScript文件

如果我错了,请纠正我。

1

如果您想使用控制器的Javascript代码(其中引用您打算使用Groovy代码的JavaScript呈现的HTML页面)创建的模型,那么你就可以使用这种技术:

这种技术不需要更改URL映射,也不需要您创建额外的控制器。

在您看来普惠制添加JavaScript如下:

<script type="text/javascript"> 
     <g:render template="/javascript/yourJavascriptFile"/> 
    </script> 

在视图文件夹中创建一个 “JavaScript的” 文件夹中。并创建一个名为: _yourJavascriptFile.gsp

您不仅可以在_yourJavascriptFile.gsp文件中使用所有GSP代码,还可以使用在控制器中创建的所有模型(即渲染视图)。

注意:JavaScript文件夹没有什么特别之处。您可以将其命名为任何您想要的名称或使用现有的视图文件夹。这只是一个组织和识别JavaScript Spitting GSP的HTML Spitting GSP的问题。另外,您也可以使用一些命名约定,如:_something.js.gsp等

1

名称脚本这样

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

内的GSP代码将正确地Grails的呈现。这是有效的,但我不知道它是否被认为是好主意。