Grails,如何通过控制器

时间:2017-09-20 14:11:42

标签: ajax grails

我有一个AJAX函数,当我点击一个复选框时会调用它。通常它会打开或关闭我页面的一部分。这很好,但是当发生错误时,即。在某些情况下,不允许单击复选框,我想通知AJAX这不成功。

我也不知道如何修复错误信息以显示在闪存消息使用的相同位置。

如果我使用flash消息,我需要再次重定向到同一页面然后我将页面放在其中并且那不太好。

我确信这应该是这个b的常见解决方案,因为我认为这是一个常见的情况或者......?

这就是在这种情况下使用的控制器部分:

def useWeeklyVolumes() {
    println("useWeeklyVolumes - params: "+params)
    def od = OfferDetail.get(params.id)
    String status =  od.offerHeader.status 
    if ((status == 'Sold') || (status == 'Rejected')) {
        transactionStatus.setRollbackOnly()
        return render(status: 400, text:"Offer can not be changed (Sold/Rejected)")            
    }

这就是AJAX调用的样子。

    $(document).ready(function(){
        $( document ).on('change', '.useWeeklyVolumes', function ( event ){ 
            $.ajax({
                url: '${g.createLink( controller:'offerDetail', action:'useWeeklyVolumes' )}',
                data: {ckbWeeklyVolumes:this.checked, id:this.id},
                type: 'get',
                success: function ( data ) { $( '#nono' ).html( data );     },
                error: function (jqXHR) {document.querySelector('#alert').innerHTML = jqXHR.responseText;
                            const timeoutID = window.setTimeout(() => {
                            messageBox.innerHTML = '';
                            window.clearTimeout(timeoutID);
                }, 3000);}
            });
        });
    });

这是我最近的尝试:

<script>
    $(document).ready(function(){
        $( document ).on('change', '.batman', function ( event ){ 
        alert('Hej');
            $.ajax({
                url: '${g.createLink( controller:'person', action:'register' )}',
                data: {registered:this.checked, id:this.id},
                type: 'get',
                success: function ( data ) { $( '#alert' ).html( data );     },
                error: function (jqXHR) {const alert = document.querySelector('#alert').innerHTML = jqXHR.responseText;
                        const timeoutID = window.setTimeout(function() {
                        alert.innerHTML = '';
                        window.clearTimeout(timeoutID);
                }, 3000);}
            });
        });
    });
</script>

在gsp中我添加了这个:

<span id="alert"></span>

此处显示错误消息,但在我刷新之前它会一直存在。

最终解决方案:

    <script>
        $(document).ready(function(){
            $( document ).on('change', '.batman', function ( event ){ 
                $.ajax({
                    url: '${g.createLink( controller:'person', action:'register' )}',
                    data: {registered:this.checked, id:this.id},
                    type: 'get',
                    success: function ( data ) { $( '#alert' ).html( data );     },
                    error: function (jqXHR) {const alert = document.querySelector('#alert');
                        alert.innerHTML = jqXHR.responseText;
                        const timeoutID = window.setTimeout(function() {
                            alert.innerHTML = '';
                            window.clearTimeout(timeoutID);
                        }, 3000);
                    }
                });
            });
        });

具有单独错误功能的替代解决方案:

    <script>
        $(document).ready(function(){
            $( document ).on('change', '.batman', function ( event ){ 
                $.ajax({
                    url: '${g.createLink( controller:'person', action:'register' )}',
                    data: {registered:this.checked, id:this.id},
                    type: 'get',
                    success: function ( data ) { $( '#alert' ).html( data );     },
                    error: function (jqXHR) {displayAlertMessage(jqXHR.responseText)}
                });
            });
        });


        function displayAlertMessage(message) {
            var timeOut = 5
            jQuery('#alert').text(message).fadeIn()
            jQuery('#alert').css("display", "block")
            setTimeout(function() {
            jQuery('#alert').fadeOut()
            jQuery('#alert').css("display", "none")
            }, timeOut * 1000);
        }

    </script>

2 个答案:

答案 0 :(得分:1)

您使用短信和状态代码400致电render,以便执行javascript'错误:'代码。 http://docs.grails.org/3.1.x/ref/Controllers/render.html

答案 1 :(得分:1)

如果您尝试在显示Flash消息的同一div中显示错误消息并假设div具有警报ID,则可以执行以下操作

x <- round(rgamma(100,shape = 0.5,rate = 10),1)
hist(x)

这应该进入错误函数,该函数最多接受三个参数,如文档http://api.jquery.com/jquery.ajax/中所示

这将显示您从数据中获得的消息,3秒后将删除它。

正如@bassmartin所提到的,您可以在控制器中使用render方法创建特定消息并定义状态。或者,如果您使用高于2.3的grails版本,则可以使用respond

在使用响应的第一个版本上我不是很清楚,如果您决定选择该选项,请首先阅读您的版本的文档