Как заполнить значения 2-го списка (g: select) на основе 1-го списка (g: select)? - PullRequest
2 голосов
/ 14 января 2011

Я пытаюсь загрузить значения 2-го списка (g:select) при выборе значения 1-го списка (g:select) в GSP.

Классы домена:

class Person {    
   String name
   static hasMany = [telephones:Telephone]
}

class Telephone {    
   String tNumber
   Person person

   static belongsTo = [person:Person]

}

GSP:

<td>
<g:select id="person" name="selectedPersonId" from="${Person.list(sort:name, order:asc)}" value="name" optionValue="name" optionKey="id" noSelection="['0':'--Select--']" />
</td>
<td>
<g:select id="telephone" name="selectedTelephoneId" from ="${person.telephones}" value="tNumber" optionValue="tNumber" optionKey="id" noSelection="['0','--Select--']"/>
</td>

Как я могу сделать это правильно?

Ответы [ 4 ]

3 голосов
/ 14 января 2011

Не заполняйте элементы во втором поле со списком при отображении страницы, заполняйте его при изменении значения в первом поле со списком.

<td>
<g:select id="person" name="selectedPersonId" from="${Person.list(sort:name, order:asc)}" value="name" optionValue="name" optionKey="id" noSelection="['0':'--Select--']" />
</td>
<td>
<g:select id="telephone" name="selectedTelephoneId" from ="${[]}" value="tNumber" optionValue="tNumber" optionKey="id" noSelection="['0','--Select--']"/>
</td>

Добавьте событие onchange к первому комбинированному списку (вы можете использовать jquery или простой Javascript), которое будет заполнять телефонные данные в зависимости от выбранного человека.Здесь вы можете использовать ajax-вызов к действию, например:

def getTelephones = {
    def telephoneInstanceList = Telephone.findAllByPerson(Person.get(params.personId))
    def telephones = telephoneInstanceList.collect {[id: it.id, phone: it.tNumber]}
    render telephones as JSON
}
2 голосов
/ 08 февраля 2013

Во-первых, не используйте таблицы, чтобы использовать div'ы. Используйте функцию remoteFunction внутри первого g: выберите передачу в текущем выделении в качестве параметров, вызов будет выглядеть примерно так:

"${remoteFunction(action: 'methodName', update: 'DivToUpdate', params: '\'id=\'+this.value')}"

Теперь в вашем методе на контроллере вы вызываете render для шаблона, содержащего ваш второй g: select. Этот g: select может использовать либо значения полей из контроллера, либо информацию из параметров. Надеюсь, это поможет

0 голосов
/ 21 июля 2014

Обновление: Grails с тех пор разместил вики-страницу на этом: https://grails.org/AJAX-Driven+SELECTs+in+GSP

0 голосов
/ 16 января 2011

Этот вопрос похож на ваш: Grails: загрузка данных в один ComboBox в зависимости от другого .По сути, это то же самое, что и в ответе йогибиза, но рекомендую несколько других вариантов.

...