我有 Controller :
package plugin
class TestController {
def simply = {[name:new Date()]}
}
如你所见,我传递了参数 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>
此页面运行正确 - 加载后我看到带有当前日期的警报窗口:)
但是,当
查看页面:
<html>
<head>
<script type="text/javascript" src="${resource(dir:'resource/js',file:'simply.js')}?color=FA8DF">
</script>
</head>
<body>
</body>
</html>
和外部 simply.js 文件:
alert("${name}")
我看到空的警报窗口。那么,我的问题是:如何将参数传递给 external.js 文件?
最佳答案
当 View 显示给用户时,解析 View 有两个阶段。状态一是服务器执行 View 页面中包含的任何代码。在你的情况下
${name}
转换为当前日期,因为这是来自 Controller 的值。这意味着发送到用户浏览器的文本包含 3/2/2010 而不是 ${name}
用户访问 View 时发生的第二个阶段是浏览器解析 HTML。发送到浏览器的 HTML 取决于服务器上发生的事情。由于在您的示例中,JavaScript 包含在 View 中,因此 ${name} 被替换为服务器上的当前日期。然后包含 3/3/2010 的 JavaScript 被发送到浏览器,因为 ${name} 在服务器上被替换为 3/3/2010。这意味着弹出框将包含 3/3/2010。如果您包含外部 JavaScript 文件,它们永远不会通过第一步运行,因为浏览器直接下载它们并且不会向服务器发出请求。这意味着第一步永远不会发生,因此 $[name} 不会被 Controller 中的值替换。此行为与您使用的天气相同
<script>
或
<g:javascript>
标签。 为了将值从 View 传递到位于外部文件中的 JavaScript,如果您希望传递参数,您应该将 JavaScript 定义为外部文件中的函数。例如在 external.js 中
Function dispDate(theParam)
{
Alert(theParam);
}
然后从你的 Angular 来看
<g:javascript src="external.js" />
<script type="text/JavaScript">
dispDate(“${name}”);
</script>
external.js存放在web-app/js目录下
关于javascript - 从 Controller 到外部 .js 文件的 Grails.pass 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314373/