2010-02-10 84 views
8

我想了幾個參數傳遞給Grails中一個remoteFunction但我掙扎正確格式化Grails的RemoteFunction PARAMS語法

我想在頁面上的數據塊的值傳遞再加上我剛纔標籤出來的,所以在我的onblur文本框中的值,我沿着線的東西:

onblur=${remoteFunction(action:'dave', update:'pack'+it.id, 
     params:[denom:document.getElementById(denomValue+${it.id}).value , 
     amount:this.value ])} 

這並不編譯 - 既不做任何排列我可以拿出來與不同數量的單引號和轉義字符。

I thi nk真正絆倒我的是我不明白我在這裏創造了什麼。這是否像使用JSP代碼創建後續將執行的JavaScript?什麼時候這個表達式被評估 - 它是在頁面被編譯的時候 - 或者在被調用的時候是一個=它呢?

任何幫助非常感謝。

回答

9

看起來您已將服務器端代碼與客戶端代碼混淆在一起。

Grails代碼將在頁面「內置」發送到客戶端瀏覽器時進行評估。

當頁面被傳送到瀏覽器時,Javascript代碼將被評估。

考慮到這一點,讓我們來看看你的onblur分配:

onblur=${remoteFunction(
     action:'dave', 
     update:'pack'+it.id, 
     params: [denom: document.getElementById(denomValue+${it.id}).value, 
        amount: this.value ])} 

鑑於$ {remoteFunction ...}調用是一個Grails標籤,它會在服務器上進行評估,生成固定字符串,然後發送到客戶端。通話內的所有內容都必須是有效的Groovy代碼。

看那PARAMS地圖,你已經添加了一些JavaScript在DENOM值,的Groovy代碼:

document.getElementById(denomValue 

然後嘗試在Groovy

+${it.id} 
增加值

then some Javascript again

).value 

Groovy c ompiler會嘗試將Javascript評估爲Groovy代碼並失敗。

如果需要使用在JavaScript客戶端的參數,你需要處理的Javascript自己(而不是使用remoteFunction標籤),例如處理遠程調用:

var path=${createLink(action:'dave', 
         params: [amount:this.value])} 
      + "&denom=" 
      + document.getElementById(denomValue+${it.id}).value 

你」您還需要使用Javascript自行處理遠程響應以更新'pack'元素。您可以隨時查看remoteFunction調用生成的內容,將其複製到頁面中並進行編輯以完成您想要的操作。

HTH

+0

+1了深入的技術解釋,其中很多人搞混的。混合客戶端和服務器端的理解可能會讓人困惑,特別是當服務器端語言試圖爲您生成Javascript時。雖然在Javascript中處理所有事情的方法是合理的,但是適當地轉義params答案對於一次性更有意義。 – 2011-10-14 22:44:05

6

或者你可以通過按「&」分離的參數,如

params:'\'param1=\'+this.value+\'&booleanParam2=true\''

5

實際上,你可以仍然使用遙控功能標籤,你就必須寫在JavaScript中的參數對象字符串,所以這實際上在我工作的東西中工作得很好。

var denomValue = document.getElementById(denomValue+${it.id}).value; 
onblur=${remoteFunction(
    action:'dave', 
    update:'pack'+it.id, 
    params: '{denom: denomValue, amount: this.value}' 
    )} 
0

我有同樣的問題,但所有的答案上面沒有幫助,因爲我想是從選擇下拉列表中選擇的值以及表裏面obj實例正被迭代的值。下面是解決方案。

<g:select 
              from="${list}" 
             optionKey="value" 
             optionValue="key" 

             onchange="getValue(this.value, ${instance.id})"/> 

    <script type="text/javascript">  
       function getValue(Id1, Id2) 
       { 

        $.ajax({ 
         type: 'POST', 
         url: '/app/controller/functionToCall', 
         data: { someId: Id1, otherId:Id2}, 

        }); 

       } 
2
<button type="button" class="btn btn-success" id="value-pie" onClick="ajaxFunction(this.value)">Confirmar</button> 

<script> 
function ajaxFunction(id){ 
    var obs = $("#observacion").val() 
    var parameters = { "serieId":id, 
         "observacion":obs 
         } 
    <g:remoteFunction controller="control" 
        action="ajax" 
        method="GET" 
        onSuccess="updateModal(data)" 
        params="parameters"/> 
} 
</script> 
+1

用多個參數調用javascript的很好的答案 – 2017-04-18 21:13:26

相關問題