代码之家  ›  专栏  ›  技术社区  ›  DaveH

grails remotefunction参数语法

  •  8
  • DaveH  · 技术社区  · 15 年前

    我试图将一些参数传递给Grails中的一个远程函数,但是我正在努力正确地格式化它。

    我想输入页面上一段数据的值加上我刚用制表符替换掉的文本框的值,所以在我的onblur中,我有一些东西沿着以下行:

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

    这不会编译-我也可以用不同数量的单引号和转义字符来进行排列。

    我觉得真正困扰我的是我不明白我想在这里创造什么。这是否像使用JSP代码创建Javascript一样,稍后将执行它?这个表达式是什么时候被计算出来的?它是在页面被编译的时候,还是在oblur被调用的时候a=it?

    非常感谢您的帮助。

    5 回复  |  直到 10 年前
        1
  •  9
  •   Dave Bower Ekaterina Zdorov    15 年前

    看起来你把服务器端代码和客户端代码混在一起了。

    当页面被“构建”并发送到客户端浏览器时,将对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代码。

    看看参数映射,在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调用生成的内容,将其复制到页面中,然后编辑它以执行您想要的操作。

    高温高压

        2
  •  6
  •   Photon    14 年前

    或者,您可以传递由“like”分隔的参数

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

        3
  •  5
  •   rnovak1988    12 年前

    实际上,您仍然可以使用远程函数标记,只需将参数写入一个javascript对象字符串中,所以这实际上在我使用的东西中非常有效。

    var denomValue = document.getElementById(denomValue+${it.id}).value;
    onblur=${remoteFunction(
         action:'dave', 
         update:'pack'+it.id, 
         params: '{denom: denomValue, amount: this.value}'
         )}
    
        4
  •  2
  •   Alvaro Vicente León Silvano    10 年前
    <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>
    
        5
  •  0
  •   user742102    10 年前

    我有同样的问题,但是上面所有的答案都没有帮助,因为我想要得到的值是从选择下拉列表中选择的值,以及正在被迭代的表中的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},
    
                      });
    
                  }