2010-02-10 119 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

相关问题