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")
}
}
}