Grails RemoteFunction params语法

时间:2010-02-10 20:07:41

标签: grails

我正在尝试将一些参数传递给grails中的remoteFunction,但我正在努力将其正确格式化

我想传递页面上一段数据的值加上我刚刚选中的文本框的值,所以在我的onblur中我有一些类似的东西:

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

这不会编译 - 我也不能用不同数量的单引号和转义符来提出任何排列。

我认为真正让我感到困惑的是,我真的不明白我想在这里创造什么。是否就像使用JSP代码创建JavaScript,我将在以后执行?什么时候对这个表达式进行评估 - 它是在编译页面的时候 - 或者在调用oblur时是a =它?

非常感谢任何帮助。

5 个答案:

答案 0 :(得分: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地图,你在denom值中添加了一些Javascript,里面 Groovy代码:

document.getElementById(denomValue

然后你尝试从Groovy

添加一个值
+${it.id}

然后再一些Javascript

).value

Groovy编译器将尝试将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

答案 1 :(得分:6)

或者您可以传递由'&'分隔的参数喜欢

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

答案 2 :(得分:5)

你实际上仍然可以使用远程功能标签,你只需要在javascript对象字符串中写入参数,所以这实际上在我使用的东西中工作得很好。

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

答案 3 :(得分: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>

答案 4 :(得分: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},

                  });

              }