从控制器到外部.js文件的Grails.pass参数?

时间:2010-11-30 13:42:47

标签: javascript grails

我有控制器:

package plugin

class TestController {

def simply = {[name:new Date()]}
}

如你所见,我传递了param name

我的观看页面:

<html>
<head>
<!-- <script type="text/javascript" src="${resource(dir:'resource/js',file:'simply.js')}?color=FA8DFF">-->

<g:javascript>
    alert("${name}")
</g:javascript>
</head>
<body>
</body>
</html>

此页面运行正确 - afrer load我看到当前日期的警报窗口:)

但是,

查看页面:

<html>
<head>
<script type="text/javascript" src="${resource(dir:'resource/js',file:'simply.js')}?color=FA8DF">
</script>
</head>
<body>
</body>
</html>

和外部的simple.js文件:

alert("${name}")

我看到空警报窗口。那么,我的问题是:我如何将params传递给external.js文件?

1 个答案:

答案 0 :(得分:4)

在向用户显示视图时,解析视图有两个阶段。状态1是执行视图页面中包含的任何代码的服务器。在你的情况下

${name}

变为当前日期,因为那是控制器的值。这意味着发送到用户浏览器的文本包含3/2/2010而不是$ {name}

用户访问视图时发生的第二个阶段是浏览器解析HTML。发送到浏览器的HTML取决于服务器上发生的情况。因为在您的示例中,JavaScript包含在视图中,$ {name}将替换为服务器上的当前日期。然后将包含3/3/2010的JavaScript发送到浏览器,因为$ {name}已被服务器上的3/3/2010替换。这意味着弹出框将包含3/3/2010。如果您包含外部JavaScript文件,它们永远不会在第一步中运行,因为浏览器直接下载它们并且不向服务器发出请求。这意味着第一步永远不会发生,因此$ [name}不会被控制器中的值替换。此行为与您使用

的天气相同
<script>

<g:javascript>

标签。 为了将视图中的值传递到位于外部文件中的JavaScript,如果要传递参数,则应将JavaScript定义为外部文件中的函数。例如在external.js

Function dispDate(theParam)
{
Alert(theParam);
}

然后从你看来

<g:javascript src="external.js" />
<script type="text/JavaScript">
dispDate(“${name}”);
 </script>

其中external.js存储在web-app / js目录中。