【问题标题】:How to pass a javascript variable into a groovy block如何将 javascript 变量传递到 groovy 块中
【发布时间】:2014-02-26 14:50:47
【问题描述】:

我需要在我的 javascript 函数中管理一个 groovy 列表对象。 我在 javascript 函数中有一个 groovy 块。 我试过这个:

var obj = ${mediaObjectInstanceList as grails.converters.JSON}[index];

还有这个:

var obj = ${mediaObjectInstanceList.get(index)};

但两者都是错误的。在第二个中,我将从 groovy 块中指定“索引”int javascript 变量。

【问题讨论】:

    标签: javascript grails groovy


    【解决方案1】:

    你不能以你定义的方式做到这一点。

    不过,实现这一目标的可能性有很多。

    其中之一是定义一个 JS 变量并用 groovy 模型值填充它:

    var myArray = new Array( 
    <g:each in="${mediaObjectInstanceList}" var="obj" status="ix">
      ${status ? ',' : ''} '${obj}'
    </g:each>
    );
    

    那么你可以在 JS 中使用普通的下标符号遍历这个数组:

    var someVal = myArray[ index ];
    

    【讨论】:

    • var myArray = new Array( ${mediaObjectInstanceList.collect { it as JSON}.join(',')} ); ?
    • 如果obj 包含单引号,这可能不起作用。我的 JS 很生锈,但 ${new JSON(["q'q",'dq"dq']).toString() } 不够吗?
    • 为什么我需要将对象转换为 JSON 以再次转换为字符串?只是为了浪费资源?为了对抗单引号,一个简单的replaceAll() 就足够了
    • 不幸的是,我无法解决我的问题。我需要创建第二个对象列表,不包括其中的一些,然后将其作为表单输入值传递。但不幸的是,groovy 仅适用于字符串,无法传递对象列表。我找到了另一个解决方案,我在下面的答案中将其解释为评论。感谢您的贡献!
    【解决方案2】:

    正如injecteer 所回答的,你不能那样做。主要是因为:

    • groovy 块在服务器端执行:它们无法知道只有浏览器知道的 javascript 中的变量。
    • javascript 在客户端执行,即。浏览器不知道变量 mediaObjectInstanceList(只有您的 grails 应用程序知道)。

    两个(主要)解决方案:

    • 您在生成页面时不知道您的索引(您的请求中没有参数)=> 您必须生成整个数组服务器端(groovy)才能在客户端(javascript)使用。

      var mediaObjectInstanceListInJS = new Array( ${mediaObjectInstanceList.collect { it as JSON}.join(',')} ); var someVal = mediaObjectInstanceListInJS[索引];

    • 您已经拥有索引服务器端(在您的请求中包含参数)=> 您只能进入 groovy 块:

      var someVal = ${mediaObjectInstanceListInJS[params.index] as JSON} ;

    【讨论】:

    • 谢谢,我真的没有考虑过两种不同的细化时间(groovy 的服务器端和 javascript 的客户端)。基本上我想创建一个对象列表以传递给控制器​​,其中仅包括检查的对象。我解决了用 check_ 命名复选框的问题,然后使用 javascript 创建一个已检查 ID 的列表并将其添加为隐藏的表单输入。因此,控制器的方法可以使用列表中的 id 重新加载对象。谢谢你启发了我:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2011-04-02
    • 2010-11-02
    • 2021-12-30
    • 2015-02-03
    相关资源
    最近更新 更多