У меня есть динамически отображаемые списки, при выборе элемента в первом списке элементы во втором списке будут заполняться (с помощью ajax).
код:
<g:each in="${files}" var="file" status="i">
<tr>
<td>
<%
String name = file.fileName;
if (name.length() > 30) {
def result = "";
int z = 0;
name.each { character ->
result = "${result}${character}";
z++;
if (z > 30) {
z=0;
result = "${result}<br />";
}
}
println result;
} else {
println name;
}
%>
<g:hiddenField name="files.${i}" value="${file.fileName}" />
</td>
<td>
<g:select name="manufacturers.${i}" from="${manufacturers}" onChange="updateDevices('${i}')" noSelection="${['null':'Select a manufacturer']}" value="${fileInfo[file.fileName]?.selectedManufacturer}" />
</td>
<td>
<div id="devicesField.${i}">
<g:if test="${fileInfo[file.fileName]?.selectedDevice != null}">
<g:select name="devices.${i}" class="deviceSelect" from="${fileInfo[file.fileName]?.devices}" noSelection="${['null':'Select a manufacturer']}" value="${fileInfo[file.fileName]?.selectedDevice?.toString()}" />
</g:if>
<g:else>
<g:select name="devices.${i}" class="deviceSelect" from="${[:]}" noSelection="${['null':'Select a manufacturer']}" />
</g:else>
</div>
</td>
<td><input type="button" value="Add a Device" onClick="deviceInfo('${i}','fileInfo','files','manufacturers')" /></td>
</tr>
<br />
<div id="deviceInfo.${i}">
</div>
</g:each>
</table>
<br />
Can't find your device? <a href="mailto:support@flexion.se?subject=Wizard%20New%20Device">Request new device addition</a>
<br /><br />
<g:submitButton name="back" value="Back" /> <g:submitButton name="next" value="Next" />
<g:hiddenField name="viewAccordingToBrowser" value="${currentView}" />
</g:form>
</div>
</div>
<script>
function updateDevices(id) {
new Ajax.Updater(
"devicesField." + id,
"/wizard/submission/ajaxGetDevicesForManufacturer", {
method:'get',
parameters: {
selectedValue : $F("manufacturers." + id),
id: id
}
}
);
}
function deviceInfo(id,fileInfo,files,manufacturers) {
alert("hi, in deviceInfo function .... ");
new Ajax.Updater(
"deviceInfo." + id,
"/wizard/submission/ajaxGetDevicesInfo", {
method:'get',
parameters: {
fileInfo : fileInfo,
files: files,
manufacturers : manufacturers,
id: id
}
}
);
}
</script>
</body>
</html>
Я хотел бы иметь кнопку рядом со списком, и после щелчка я хочу добавить еще один набор списков ниже.
Я попробовал событие нажатия кнопки, но кажется, что оно не работает должным образом.
Любые лучшие идеи будут полезны.
---- код контроллера для метода ajax
def ajaxGetDevicesInfo = {
LOG.debug("inside ajaxGetDevicesInfo %%%%%%%%%%%%%%%%%")
LOG.debug("fileInfo=" + params.fileInfo);
LOG.debug("files=" + params.files);
LOG.debug("manufacturers=" + params.manufacturers);
LOG.debug("id=" + params.id);
render(template:"deviceInfo", model : ['fileInfo' : params.fileInfo, 'files': params.files, 'manufacturere': params.manufacturers])
}
шаблон для динамического просмотра Ajax:
<table>
<g:each in="${files}" var="file" status="i">
<g:hiddenField name="files.${i}" value="${file.fileName}" />
<tr>
<td></td>
<td>
<g:select name="manufacturers.${i}" from="${manufacturers}" onChange="updateDevices('${i}')" noSelection="${['null':'Select a manufacturer']}" value="${fileInfo[file.fileName]?.selectedManufacturer}" />
</td>
<td>
<g:if test="${fileInfo[file.fileName]?.selectedDevice != null}">
<g:select name="devices.${i}" class="deviceSelect" from="${fileInfo[file.fileName]?.devices}" noSelection="${['null':'Select a manufacturer']}" value="${fileInfo[file.fileName]?.selectedDevice?.toString()}" />
</g:if>
<g:else>
<g:select name="devices.${i}" class="deviceSelect" from="${[:]}" noSelection="${['null':'Select a manufacturer']}" />
</g:else>
</td>
</tr>
</g:each>
</table>
не работает, как задумано. любой вклад очень полезен