Grails: carga datos en un ComboBox dependiendo de otro
groovy multiple-select (3)
Parece que querrás usar AJAX para esto. Una forma de hacerlo es usar una combinación de plantillas y objetos de dominio:
// grails-app/domain/ShippingOption.groovy
class ShippingOption = {
String method, // can be ''ground'', ''sea'', ''air'', or ''general''
name // can be ''fedex'', ''ups'', etc.
def options = {
def meth = params.method ?: "general"
def comList = ShippingOption.findByMethod(meth)
render(template:"shippingList", model: [ commodityList: comList ])
}
}
Y la plantilla:
<!-- grails-app/views/_shippingList.gsp -->
<g:each var="opt" in="${commodityList}">
<option value="${opt.name}">${opt.name}</option>
</g:each>
Y en su gsp con el cuadro de selección en él:
<!-- ... other stuff is before here ... -->
<g:select name="method" from="${[''GENERAL'', ''GROUND'', ''SEA'', ''AIR'']}"
onchange="${remoteFunction(action:''options'', update:''commodity'',
params:''''method='' + this.value'' )}" />
<select id="commodity"></select>
Estoy seguro de que he estropeado algo de sintaxis, y definitivamente tendrá que refactorizar esto un poco para que funcione con su código. Pero al menos tienes la idea general.
Y para usarlos, agréguelos a la base de datos como ShippingOption
. Aquí hay una manera de hacerlo.
["fedex", "ups"].each { name ->
def so = new ShippingMethod(method: "ground", name: name )
so.save()
}
PD: también podría renderizar los métodos de envío dinámicamente también.
Ver también: remoteFunction , g: select , templates y AJAX
Digamos que tengo un combobox con las opciones GENERAL, AIR, GROUND y SEA
<g:select name="group" from="${[''GENERAL'', ''AIR'', ''GROUND'', ''SEA'']}" valueMessagePrefix="default.category" value="${tipoN}" />
Y luego otro cuadro combinado que carga cierta información dependiendo de si selecciona GENERAL, AIR, GROUND o SEA.
Digamos que GROUND
tiene 3 opciones, FedEx, USPS, DHL
, pero AIR
tiene otras diferentes, AIRPLANE, JET, HOT AIR BALLOON
.
El nombre del otro <g:select>
debe ser "commodity"
Pensé en crear un archivo javascript y tratar todo como HTML, pero investigué en Google y no es tan simple como pensaba.
¿Alguien sabe cuál sería la mejor manera de hacer esto? ¡Gracias por adelantado!
FG
Consideraría rediseñar tu UI y cambiar el flujo. Una dependencia desplegable que está describiendo sugiere que la forma probablemente debería dividirse y adoptar una solución tipo "asistente" dará como resultado una solución más amigable y fácil de usar que también funcionará sin JavaScript.
Tengo un ejemplo trabajado usando AngularJS y Grail aquí:
http://wordpress.transentia.com.au/wordpress/2013/12/24/keeping-up-with-the-joneses/
(disculpas si esto no es apropiado TAN ''estilo'', pero no creo que publicar cientos de líneas de código y verborrea sea apropiado tampoco).