grails select с помощью remoteFunction, может ли он обновить g: TextField?

#grails

#grails

Вопрос:

Мне нужно обновить значение текстового поля, используя значение на сервере, на основе значения, которое пользователь выбирает в g: select. В коде:

  <g:select name="description" from="${momentum.MoneyTransType.prodList}" value="${moneyInstance?.description}"
               noSelection="['':'-Select Description-']" onChange="${remoteFunction(action:'setHowMuch', update:[success:'howMuch', failure:'failure'],
               params:''selection='   this.value', options=[asynchronous:false])}"/>

 <g:textField id="howMuch" name="howMuch" value="${moneyInstance?.howMuch}"/>
  

Это не работает. Если я дам «update: [success:» идентификатор div, все хорошо, но это не то, что я хочу. Мне нужно разрешить пользователю вводить описание свободного потока (которое у меня будет в другом текстовом поле) и количество свободного потока. Думаю, я мог бы скрыть div, а затем прослушать изменения в этом div с помощью jQuery, а затем обновить текстовое поле amount. Должен ли я иметь возможность обновлять текстовое поле, используя функцию remoteFunction «update» или используя другую функцию grails?

Как ни странно, ввод временного «скрытого» div с помощью функции изменения jQuery не работает для обновления текстового поля, т. Е. Следующее предупреждение и т. Д. Не срабатывает:

         $('#toHide').change(function() {
            alert(" I got changed, value:");
            $("#howMuch").text($(this).val());
        });
  

Ответ №1:

Ну, после написания всего приведенного ниже, я перечитал ваш вопрос и вижу, что вы заявили, что знаете, что это работает с div. Итак, остальная часть моего ответа может быть бесполезной, но что плохого в использовании div? Пустой div ничего не отобразит, поэтому вам не нужно его скрывать. Итак, FWIW:

  1. Поместите свой <g:textField ...> в шаблон.
  2. Добавьте div, где вы хотите, чтобы шаблон отображался. Другими словами, замените текущее <g:textField ..> на <div id=updateme name=updateme></div>

  3. В вашем setHowMuch действии отобразите шаблон.

Например, я делаю:

В поле зрения:

 <g:select class='setTagtypeValue-class'
            name='tagtype-${i}-header'
            from="${org.maflt.ibidem.Tagtype.list(sort:'tagtype').groupBy{it.tagtype}.keySet()}"
            value="${setTagtypeValue?.tagtype?.tagtype}"
            valueMessagePrefix="tagtype"
            noSelection="${['null':'Select One...']}"
            onchange="${remoteFunction(action:'options', update:'tagtype-options-${i}',  
                    params:''tagtype='   this.value  'amp;i=${i}'' )}" />
  

Действие контроллера:

 def options = {
    def i = params.i ?: 0
    def tagtypes = Tagtype.findAllByTagtype(params.tagtype)

    render(template:"tagtypeList", model:[tagtypes:tagtypes,i:i])

}
  

Шаблон списка тегов:

 <table>
  <tr>
    <th></th>
    <th><g:message code="tagtype.lookup" 
                    default="Lookup Table" /></th>
    <th><g:message code="tagtype.regexpression" 
                    default="Field Rule" /></th>
    <th><g:message code="tagtype.uicomponent" 
                    default="UI Component" /></th>
  </tr>
  <g:each in="${tagtypes}" var="tagtype" status="j">
  <tr>
    <td><g:radio name="setTagtypesList[${i}].tagtype.id" value="${tagtype.id}" 
            checked="${(setTagtypeValue?.tagtype?.id == tagtype.id ||
                            (!setTagtypeValue?.tagtype?.id amp;amp; j==0))}"></g:radio></td>
    <td>${tagtype.lookupTable}</td>
    <td>${tagtype.regexpression}</td>
    <td><g:message code="${'uicomponent.'   tagtype.uicomponent.id}" 
                    default="${tagtype.uicomponent.uicomponent}" />
    </td>                               
  </tr>
  </g:each>
</table>
  

Этот код взят с экрана metadataset (называемого набором полей в пользовательском интерфейсе) в http://www.maflt.org/products/Ibidem .

Комментарии:

1. Спасибо, Брэд. Конечный пользователь вводит в текстовое поле сумму, которую он хочет взимать. Как правило, это должно быть результатом описания, которое они выбирают в списке, но это не обязательно — т.Е. Один выбор в списке — «другое». В «другом» случае у меня также будет отображаться текстовое поле произвольной формы, чтобы они могли ввести описание взимаемой платы (а не только суммы).