2017-02-24 9 views
0

呈現模板我試圖通過遠程操作Grails的遠程行動

部分更新視圖這是我的看法(home/index.gsp

<button type="button" class="btn btn-success">Update</button> 
<g:render template="datetime", model="[mybean: mybean]"/> 

這是我的模板(住宅/ _datetime.gsp )

<p>Time: ${mybean.getHours()} : ${mybean.getMinutes()} : ${mybean.getSeconds()}</p> 

這是我的js

$("button.btn-success").click(function(event){ 
    $.post("/home/updateTime") 
}) 

這是我的控制器

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模板正確地呈現,但是當我點擊按鈕的模板沒有更新。爲什麼?

回答

0

將模板包裹在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> 
+0

什麼您已撰寫作品,但未使用渲染模板grails功能 – fabiocolo

+0

加載頁面(index.gsp)時,將評估所有標記和表達式。如果不重新加載頁面,則無法觸發重新渲染。在這種情況下,homeController/updateTime會導致重新渲染,返回結果,並通過jQuery將其設置爲DOM。 –

+0

以上更改爲'.success(函數(數據){$('#dtsDiv').html(data); });'這將呈現實際數據aka您的模板返回div這是JavaScript基本花花公子 – Vahid

0

我認爲上述評論回答您呈現模板的擔憂。評論指出,當你觸發一個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已經建議渲染響應文本之外,其實是錯誤的。

總之理由我的回答是不相關的更關係到緩解的常規和Java方法的實際問題

嘗試

<p>Time: ${mybean.hours} : ${mybean.minutes} : ${mybean.seconds}</p> 

嘗試

類的HomeController {

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