Grails通过远程操作渲染模板

Grails通过远程操作渲染模板,grails,Grails,我正在尝试通过远程操作部分更新视图 这是我的观点(home/index.gsp) 这是我的控制器 class HomeController { def index() { def bean = new MyDateBean() render view:"index", model:[mybean:bean] } def updateTime(){ log.debug("Updating time") de

我正在尝试通过远程操作部分更新视图

这是我的观点(
home/index.gsp

这是我的控制器

class HomeController {

    def index() {
        def bean = new MyDateBean()
        render view:"index", model:[mybean:bean]
    }

    def updateTime(){
        log.debug("Updating time")
        def bean = new MyDateBean()
        render template:"datetime", model:[mybean:bean]
    }


    class MyDateBean{

        private String hours
        private String minutes
        private String seconds

        MyDateBean(){
            def date = new Date()
            this.hours = date.format("H")
            this.minutes = date.format("m")
            this.seconds = date.format("s")
        }

        String getHours(){
            return this.hours
        }

        String getMinutes(){
            return this.minutes
        }

        String getSeconds(){
            return this.seconds
        }
    }   
}

如果我浏览到
/home/index
,模板将正确呈现,但当我单击按钮时,模板不会更新。为什么?

将模板包装在一个div中,例如

<div id="dtsDiv">
    <g:render template="datetime" model="[mybean: mybean]"/>
</div>

然后使用以下javascript:

<script type="text/javascript">
            $( document ).ready( function() {

        $("button.btn-success").click(function(event){
            $.ajax({
                url: "${g.createLink( controller:'test', action:'updateTime')}",
                type: 'get'
            }).success( function ( data ) { $( '#dtsDiv' ).html( data ); });
        })
    });
</script>

$(文档).ready(函数(){
$(“button.btn success”)。单击(函数(事件){
$.ajax({
url:“${g.createLink(控制器:'test',操作:'updateTime')}”,
键入:“获取”
}).success(函数(数据){$('#dtsDiv').html(数据);});
})
});

我认为上面的评论回答了您对渲染模板的担忧。评论指出,当您触发jquery方法(ajax)调用时,会向控制器发出一个请求,并且可以使用

if (request.xhr) {
 render template:'template'
 return
}
// since we return above no need for else and so hence otherwise
render view: 'view'
当向控制器发出ajax请求时,只能返回一个模板,所以您自己的注释实际上是错误的,除了Mike建议呈现响应文本之外

无论如何,我回答这个问题的原因和实际问题无关,更多的是和groovy和java方法的易用性有关

试一试


您编写的内容可以工作,但不使用呈现模板grails功能加载页面(index.gsp)时,会计算所有标记和表达式。如果不重新加载页面,则无法触发重新渲染。在这种情况下,homeController/updateTime会导致重新渲染,返回结果,并通过jQuery.change将其设置为DOM,将其更改为
.success(函数(数据){$('#dtsDiv').html(数据);})这将使实际数据(即模板)返回到div上这是javascript basics dude
<div id="dtsDiv">
    <g:render template="datetime" model="[mybean: mybean]"/>
</div>
<script type="text/javascript">
            $( document ).ready( function() {

        $("button.btn-success").click(function(event){
            $.ajax({
                url: "${g.createLink( controller:'test', action:'updateTime')}",
                type: 'get'
            }).success( function ( data ) { $( '#dtsDiv' ).html( data ); });
        })
    });
</script>
if (request.xhr) {
 render template:'template'
 return
}
// since we return above no need for else and so hence otherwise
render view: 'view'
<p>Time: ${mybean.hours} : ${mybean.minutes} : ${mybean.seconds}</p>
def index(MyDateBean bean) {
    render view:"index", model:[mybean:bean]
}

def updateTime(MyDateBean bean){
    log.debug("Updating time")
    render template:"datetime", model:[mybean:bean]
}


class MyDateBean{

    def date=new Date()

    String getHours(){
        return  date.format("H")
    }

    String getMinutes(){
        return  date.format("m")
    }

    String getSeconds(){
        return  date.format("s")
    }
}   
}