如何将javascript变量传递到groovy块
我需要在javascript函数中管理groovy列表对象。 我在javascript函数中加入了groovy块。 我试过这个:如何将javascript变量传递到groovy块,javascript,grails,groovy,Javascript,Grails,Groovy,我需要在javascript函数中管理groovy列表对象。 我在javascript函数中加入了groovy块。 我试过这个: var obj = ${mediaObjectInstanceList as grails.converters.JSON}[index]; 这是: var obj = ${mediaObjectInstanceList.get(index)}; 但两者都错了。在第二个示例中,我将从groovy块中指定“index”int javascript变量。您不能以您定义
var obj = ${mediaObjectInstanceList as grails.converters.JSON}[index];
这是:
var obj = ${mediaObjectInstanceList.get(index)};
但两者都错了。在第二个示例中,我将从groovy块中指定“index”int javascript变量。您不能以您定义的方式来完成这项工作 不过,实现这一目标有很多可能性 其中之一是定义JS变量并用groovy模型值填充它:
var myArray = new Array(
<g:each in="${mediaObjectInstanceList}" var="obj" status="ix">
${status ? ',' : ''} '${obj}'
</g:each>
);
正如注射工所回答的,你不能那样做。主要原因是:
- groovy块是在服务器端执行的:它们不知道javascript中的变量,只有浏览器知道
- javascript在客户端执行,即浏览器不知道变量
(只有grails应用程序知道)mediaObjectInstanceList
- 当页面生成时,您不知道自己的索引(请求中没有参数)=>您必须生成整个阵列服务器端(groovy)才能在客户端(javascript)上使用 var mediaObjectInstanceListInJS=新数组(${mediaObjectInstanceList.collect{it as JSON}.join(',')}); var someVal=mediaObjectInstanceListInJS[索引]
- 您已经有了索引服务器端(请求中带有参数)=>您可以在groovy块中仅获取所选对象: var someVal=${mediaObjectInstanceListInJS[params.index]as JSON}
var myArray=新数组(${mediaObjectInstanceList.collect{it as JSON}.join(',')})代码>?如果一个obj
包含一个引号,则这可能不起作用。我的JS非常生锈,但不会${new JSON([“q'q”,“dq”dq'])。toString()}
就足够了?为什么我需要将对象转换为JSON以再次转换为字符串?为了只浪费资源?为了对抗单引号,需要一个简单的replaceAll()
就足够了。很遗憾,我无法解决这样的问题。我需要创建第二个对象列表,排除其中的一些对象,然后将其作为表单输入值传递。但很遗憾,groovy仅适用于字符串,无法传递对象列表。我找到了另一个解决方案,我在下面的答案中解释为注释.谢谢你的贡献!谢谢,我真的没有考虑两种不同的精化时间(groovy的服务器端和javascript的客户端)。基本上,我想创建一个对象列表来传递给控制器,只包括选中的对象。我解决了用check_uu命名复选框的问题,然后使用javascript创建一个选中ID列表,并将其添加为隐藏表单输入。因此,控制器的方法可以使用列表中的ID重新加载对象。感谢您的帮助启发我:)
var someVal = myArray[ index ];