Grails javascript调用控制器方法

时间:2015-10-21 23:42:00

标签: javascript grails

在grails视图中,我需要调用一个javascript方法来获取一些信息,所以我有一个这样的提交动作:

Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Mon Oct 19 19:06:03 2015 from xxx.xxx.xxx.xxx
me@ubuntu:~$ python3
Python 3.4.0 (default, Jun 19 2015, 14:20:21) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
>>> 

并且在generateReport()的末尾我需要调用/重定向到Controller的<input type="submit" name="submit" class="submit action-button" value="Generar" onclick="generateReport()" style="float: right" /> 操作(因为我已经在show操作了)

我已尝试过

create

1)数据达到null 2)编译错误:

1) var jSon = generateJSON();
    <g:remoteFunction controller="report" action="show" params="[data:jSon]" />

2) var jSon = generateJSON();
    <g:remoteFunction controller="report" action="show" params="[data:${jSon}]" />

3 个答案:

答案 0 :(得分:0)

var json 无法作为params分配给数据,因为var jSon 是一个javascript变量。 params属性中的数据需要来自控制器的模型参数。

在第一个选项中,当它被指定为params时,因为它不是来自控制器的模型参数,它显示 null

第二个选项不起作用,因为这不是从控制器定义模型参数的方式,因此给出编译错误

因此,您最好尝试将jSon作为控制器的模型,然后定义为params。

或者您可以按照此链接在onclick本身中定义g:remoteFunction

http://grails.github.io/grails-doc/2.2.1/ref/Tags/remoteFunction.html

希望这有帮助!感谢。

答案 1 :(得分:0)

remoteFunction标记不适用于您的情况,因为在知道jSon的值(客户端)之前,它已呈现为html和JavaScript(服务器端)

您必须自己进行ajax调用(例如Jquery)。

答案 2 :(得分:0)

你可以试试这个..

在你的gsp中声明一个像这样的变量..

<script type="text/javascript">
            var yourVariable = "${createLink(url: [controller: 'yourController', action: 'yourAction'])}";
</script>

然后在你的js文件中..你可以使用ajax。

示例ajax

function checkUsernameAvailable(user, example){
    $.ajax(
    {
        url: yourVariable, <- this variable take from your gsp
        contentType:"text/json",
        type: "get",
        data: ({ id: usernamenya}),
        dataType: "json",
        cache: false,
        async: false,
        success: function(data) {
               //do something here
        },
        error: function(xhr) {
        }
    });                 
}