#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:
- Поместите свой
<g:textField ...>
в шаблон. -
Добавьте div, где вы хотите, чтобы шаблон отображался. Другими словами, замените текущее
<g:textField ..>
на<div id=updateme name=updateme></div>
-
В вашем 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. Спасибо, Брэд. Конечный пользователь вводит в текстовое поле сумму, которую он хочет взимать. Как правило, это должно быть результатом описания, которое они выбирают в списке, но это не обязательно — т.Е. Один выбор в списке — «другое». В «другом» случае у меня также будет отображаться текстовое поле произвольной формы, чтобы они могли ввести описание взимаемой платы (а не только суммы).