【问题标题】:How do you update a TextField from a grails remoteLink?如何从 grails remoteLink 更新 TextField?
【发布时间】:2010-03-18 13:16:48
【问题描述】:

现有标记:

<g:textField name="identifier"/>
<g:remoteLink action="newId" update="identifier">generate new id</g:remoteLink>

相应的 HTML 标记:

<input type="text" id="identifier" name="identifier">
<a onclick="new Ajax.Updater('guid','/webapp/domain/newId',{asynchronous:true,evalScripts:true});return false;" href="/webapp/domain/newId">generate</a>

点击链接时生成的 HTML 标记:

<input type="text" id="identifier" name="identifier">THE-NEW-ID-HERE</input>
<a onclick="new Ajax.Updater('guid','/webapp/domain/newId',{asynchronous:true,evalScripts:true});return false;" href="/webapp/domain/newId">generate</a>

【问题讨论】:

    标签: javascript ajax grails gsp


    【解决方案1】:

    试试

    <div id="updatableArea">
      <g:textField name="identifier"/>
    </div>
    <g:remoteLink action="newId" update="updatableArea">generate new id</g:remoteLink>
    

    在您的控制器中返回 HTML 片段

    render(text:"<input type='text' id='identifier' name='identifier'>${newid}</input>", contentType:'text/html')
    

    remoteLink 只会更新节点的内容,因此不会更新文本字段的“值”。

    希望对您有所帮助。

    【讨论】:

    • 我想你的意思是:render(text:"", contentType:' text/html') 在这种情况下,从技术上讲这可能可行,但它比我想要的更多。
    • 是的,这正是我所需要的。您唯一的其他选择是返回一些 JSON,然后使用 Javascript 处理程序填充文本框。正如 user299727 建议的那样
    • 从 ajax 调用返回的只是一个简单的字符串(即:“1234”)是否有可能以某种方式使用 remoteLink 'onSuccess' 事件来运行一些 javascript 来更新文本字段返回值?
    • 没关系,只是想出来并自己回答。谢谢!
    【解决方案2】:

    使用 onSuccess 事件的另一种方式:

    def getName = {
       def exchange = Exchange.findById(params.id)
       if (!exchange) {
          render 'not found'
       }
       else {
          render(builder: "json") {
             exchange
          }
       }
    }
    ...
    <script>
       function fillName(e) {
          var obj = toJson(e);
          $('name').value = obj.name;
       }
    
       function toJson(obj) {
          return eval('(' + e.responseText + ')');
       }
    </script>
    ...
    <g:remoteLink action="getName" id="1" onSuccess="fillName(e)">
       Get
    </g:remoteLink>
    <input type='text' name='name' id='name'/>
    

    【讨论】:

    • 感谢您的提示。采用您所做的并对其进行修改以在线为我工作。
    【解决方案3】:

    只需将以下内容添加到 remoteLink:

    onSuccess="\$('identifier').value=e.responseText;"
    

    所以最终结果(完美运行):

    <g:textField name="identifier"/>
    <g:remoteLink action="newId" onSuccess="\$('identifier').value=e.responseText;">generate new id</g:remoteLink>
    

    需要注意的两件事:

    1. $ 必须被转义,因为 'grails' 处理那个 属性。
    2. 我正在使用 Prototype javascript 库。其他库可能语法不同,但基本思想是一样的。

    【讨论】:

    • 我无法让它与 jQuery 一起使用,尝试了多种方法。你知道如何让它在 jQuery 中工作吗?谢谢
    • onSuccess="\$('identifier').value=e.responseText;" jquery 使用 'data' 而不是 'e'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多