Grails RemoteFunction params语法

Dav*_*veH 8 grails

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

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

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

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

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

任何帮助非常感谢.

Dav*_*wer 9

看起来你已经将服务器端代码与客户端代码混淆了.

当页面被"构建"以发送到客户端浏览器时,将评估Grails代码.

一旦页面传送到浏览器,将评估Javascript代码.

考虑到这一点,让我们来看看你的onblur任务:

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

鉴于$ {remoteFunction ...}调用是Grails标记,它将在服务器上进行评估,生成固定字符串,然后发送到客户端.调用内的所有内容都必须是有效的Groovy代码.

查看params地图,你在Groovy代码里面的denom值中添加了一些Javascript :

document.getElementById(denomValue
Run Code Online (Sandbox Code Playgroud)

然后你尝试从Groovy添加一个值

+${it.id}
Run Code Online (Sandbox Code Playgroud)

然后再一些Javascript

).value
Run Code Online (Sandbox Code Playgroud)

Groovy编译器将尝试将Javascript评估为Groovy代码并失败.

如果您需要在Javascript中访问客户端参数,您需要自己处理Javascript(而不是使用remoteFunction标记),例如处理远程调用:

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

您还需要使用Javascript自行处理远程响应以更新"pack"元素.您可以随时查看remoteFunction调用生成的内容,将其复制到页面中并对其进行编辑以执行您想要的操作.

HTH


Pho*_*ton 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}'
     )}
Run Code Online (Sandbox Code Playgroud)