有没有办法从 javascript 函数中调用控制器操作?

Posted

技术标签:

【中文标题】有没有办法从 javascript 函数中调用控制器操作?【英文标题】:Is there a way to call a controller action from a javascript function? 【发布时间】:2012-08-05 17:43:52 【问题描述】:

我有一个 grails 项目,我需要选择要删除的字段,当我单击删除时,我需要一个函数来删除所有选定的项目:

html代码:

<form name="bookForm" action="list" method="post">
    ....
    <a onclick="deleteBooks();">Delete</a>
    ....
    ....
    <g:checkBox id="select_all" name="select_all" value="" onclick="selectAll();" />
    ....
    <g:each in="$bookList" status="i" var="bookInstance">
        <tr class="$(i % 2) == 0 ? 'odd' : 'even'">
            <td><g:checkBox id="$bookInstance.id" name="delete_checkbox" value="" /></td>
        </tr>
    </g:each>
    ....
</form>

javascript 代码:

<script type="text/javascript">
    function selectAll()
        var select = document.getElementById("select_all");
        var checkboxes = document.forms['bookForm'].elements['delete_checkbox'];
        if (select.checked)
            for (i = 0; i < checkboxes.length; i++) checkboxes[i].checked = true;
        else
            for (i = 0; i < checkboxes.length; i++) checkboxes[i].checked = false;
        
    

    function deleteBooks()
        var checkboxes = document.forms['bookForm'].elements['delete_checkbox'];
        var counter = 0;
            for (i = 0; i < checkboxes.length; i++)
                if(checkboxes[i].checked)
                    counter ++;
                    $g.remoteFunction(action:'delete', controller:'book', id:checkboxes[i].id) 
                
            
            if (counter == 0) alert("select books to delete");
        
    </script>

selectAll 函数工作正常,但 deleteBooks 函数在我添加时会导致此错误 $g.remoteFunction(action:'delete', controller:'book', id:checkboxes[i].id)

例外:

Error 500: Error evaluating expression [g.remoteFunction(action:&#39;delete&#39;, controller:&#39;book&#39;, id: checkboxes[i].id)] on line [26]: Cannot get property &#39;null&#39; on null object
Servlet: grails
URI: /myProject/grails/book/list.dispatch
Exception Message: Cannot get property &#39;null&#39; on null object 
Caused by: Error evaluating expression [g.remoteFunction(action:&#39;delete&#39;, controller:&#39;book&#39;, id: checkboxes[i].id)] on line [26]: Cannot get property &#39;null&#39; on null object 
Class: list.gsp 
At Line: [26] 
Code Snippet:

如果我用$g.remoteFunction(action:'delete', controller:'book') 代替它

例外:

Error 500: Error evaluating expression [g.remoteFunction(action:&#39;delete&#39;, controller:&#39;book&#39;)] on line [27]: No javascript provider is configured
Servlet: grails
URI: /myProject/grails/book/list.dispatch
Exception Message: No javascript provider is configured 
Caused by: Error evaluating expression [g.remoteFunction(action:&#39;delete&#39;, controller:&#39;book&#39;)] on line [27]: No javascript provider is configured 
Class: list.gsp 
At Line: [27] 
Code Snippet:

如何从 javascript 函数或 jquery 调用控制器操作?

【问题讨论】:

【参考方案1】:
function deleteBooks()
    var checkboxes = document.forms['bookForm'].elements['delete_checkbox'];
    var counter = 0;
    for (i = 0; i < checkboxes.length; i++)
        if(checkboxes[i].checked)
              counter ++;
              var bookId = checkboxes[i].id;
              <g:remoteFunction controller="book" action="delete" id="$bookId" /> 
        
    
    if (counter == 0) alert("select books to delete");

如有错误请通知我

【讨论】:

【参考方案2】:

GSP 在服务器端工作,JavaScript 在客户端工作。不能混用,用ajax:

$.ajax(
   type: 'POST',
   url: "$createLink(action:'delete', controller:'book')/" + checkboxes[i].id
);

【讨论】:

请在 deleteBokks() 函数中混合您的代码,因为我尝试过但它没有解决我的问题(它没有给出任何错误,但它没有调用控制器操作 好的,我明白了。它是 jQuery 函数(我强烈建议您使用 jQuury 或任何其他现代 js 框架)。如果不想使用jquery,可以自己实现ajax调用——见blog.mgechev.com/2011/07/21/ajax-jquery-beginners 你看到了我的代码。能否请您为我的问题写一个完整的答案? 对不起,我不是专家,我只能告诉你如何通过使用普遍接受的框架来达到它,如果你需要低级 js 代码,最好提出一个全新的问题,比如“如何使用纯 JS 发出 ajax 请求,无需任何框架"【参考方案3】:

remoteFunction 很好,但是你需要一个 javascript 库。查看http://grails.org/plugin/jquery 以及如何安装它。

【讨论】:

不要忘记在循环中获取checkboxes[i].id 的值【参考方案4】:

如果您编写 javascript 内联,则可以这样做。但是,如果 javascript 在您包含的文件中 - 它将不起作用。你也不需要“g”。在 remoteFunction 中。

【讨论】:

不要忘记在循环中获取checkboxes[i].id 的值

以上是关于有没有办法从 javascript 函数中调用控制器操作?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 JavaScript 中定期调用函数?

从 JavaScript 调用 php 函数

从URL /地址栏调用Javascript函数

从托管 bean 调用 JavaScript 函数

我们如何知道函数是从控制台调用还是从源代码调用

如何知道何时从控制台调用 JavaScript 函数? [复制]