在Grails中使用remoteLink的动态参数

时间:2010-07-02 21:57:00

标签: grails

我想使用remoteLink(使用Prototype作为Javascript库)进行Ajax调用,但我需要将其中一个参数传递给textfield中的值。以下是我目前在GSP中所拥有的内容:

<input id="email" name="email" type="text"/>
...
<g:remoteLink action="addEmail" params="[email:???]">Add</g:remoteLink>

我应该代替什么?让remoteLink将电子邮件文本字段的值作为参数发送?基本上,我如何在Grails标签中引用/访问DOM?

我尝试了

\$('email').value

取代???但是我的GSP中出现了“无法解析脚本”的错误。

由于

6 个答案:

答案 0 :(得分:5)

我之前需要做类似的事情,以下事情对我有用(是的,不是特别优雅):

<input id="email" name="email" type="text"/>
...
<g:javascript>
    var addEmail = function()
    {
        ${ remoteFunction (action:"addEmail", update:"update-element-id", params:"  'email=' +$('email').value  ") }
    };
</g:javascript>
<a href="javascript:void(0)" onclick="addEmail();return false;">add email</a>

为了清晰起见,提取到javascript函数,并在params中添加了一些空格,以显示单引号更清晰。

答案 1 :(得分:3)

<g:remoteLink action="addEmail" params="${[email: some.groovy.to.get.your.email()]}">Add</g:remoteLink>

答案 2 :(得分:2)

有一个更好的解决方案。

在remoteLink标签中使用before属性来设置包含DOM事物的js变量。

例如: 在js:

var MyJSClass = {
  setParams: function() {
    MyJSClass.dynamicParams = {email: $("#email").val(), myOtherField: anyJSLogicHere()}  
  }
}

在gsp中:

<g:remoteLink action="addEmail" params="MyJSClass.dynamicParams" before="MyJSClass.setParams()">Add</g:remoteLink>

请参阅before代码,它是在请求之前执行的js函数,并设置将在AJAX请求中使用的dynamicParams属性。

答案 3 :(得分:0)

如果您可以使用按钮而不是链接,那么使用g:submitToRemote会变得微不足道。但是,如果它必须是一个链接,你可以做一些丑陋的事情:

views / email / index.gsp:

<%@ page contentType="text/html;charset=UTF-8" %>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Sample title</title>
    <g:javascript library="prototype" />
  </head>
  <body>
  <g:form name="theForm">
    Email: <g:textField name="emailAddr" />
    <!-- Here comes the ugly -->
    <a href="#" name="submit" 
       onclick="new Ajax.Updater('resp','${createLink(action:'addEmail')}',{asynchronous:true,evalScripts:true,parameters:Form.serialize(document.theForm)});return false">
    Submit Form
    </a>
  </g:form>
  <div id="resp">
  </div>
  </body>
</html>

电子邮件控制器:

class EmailController {

    def index = { }

    def addEmail = {

        if(params?.emailAddr) {
            render "${params.emailAddr}"
        }
        else {
            render "No Email Entered"
        }
    }
}

如果您自定义,请注意以下事项: * Ajax.Updater的第一个'resp'参数是您要更新的div的id *在Form.serialize(document.theForm)命令中,'theForm'需要与您指定表单的名称相对应。

答案 4 :(得分:0)

根据Eduard的回答,我推断出params属性中的Javascript代码将被执行。所以我尝试了以下内容并且有效:

<g:remoteLink action="addEmail" params="{email:\$('#email').val()}">Add</g:remoteLink>

答案 5 :(得分:-1)

如果您想将remoteLink与Jquery一起使用,这对我有用。

<g:remoteLink action="${myBean.action}" params="[myParam: myBean.param]" update="updateDiv">
        My Awesome Link
</g:remoteLink>
简单而整洁。