Как обновить TextField с удаленной ссылки Grails? - PullRequest
0 голосов
/ 18 марта 2010

Существующая разметка:

<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>

Ответы [ 3 ]

1 голос
/ 22 марта 2010

Другой способ использования события 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'/>
1 голос
/ 23 марта 2010

просто добавьте следующее к remoteLink:

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

Итак, конечный результат (который отлично работает):

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

2 вещи на заметку:

  1. $ должен быть экранирован из-за обработка 'Grails' этого атрибут.
  2. Я использую библиотеку Prototype javascript. Другие библиотеки могут отличаться синтаксисом, но основная идея та же.
1 голос
/ 18 марта 2010

Попробуйте

<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 просто обновит содержимое узла, чтобы не обновлять «значение» текстового поля.

Надеюсь, это поможет.

...