【问题标题】:Grails.pass parameters from the controller to external .js file?Grails.pass 参数从控制器到外部 .js 文件?
【发布时间】:2010-11-30 13:42:47
【问题描述】:

我有控制器:

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>

和外部的 simple.js 文件:

alert("${name}")

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

【问题讨论】:

    标签: javascript grails


    【解决方案1】:

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

    ${name}
    

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

    当用户访问视图时发生的第二个阶段是浏览器解析 HTML。发送到浏览器的 HTML 取决于服务器上发生的事情。由于在您的示例中,视图 ${name} 中包含的 JavaScript 被替换为服务器上的当前日期。然后包含 3/3/2010 的 JavaScript 被发送到浏览器,因为 ${name} 在服务器上被 3/3/2010 替换。这意味着弹出框将包含 2010 年 3 月 3 日。如果您包含外部 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 目录中的位置。

    【讨论】:

    • 哇,好棒的方法!但那将是 Grails 本身渲染外部文件
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多