我有控制器:
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文件?
答案 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目录中。