【问题标题】:displaying lists by button onclick grails通过按钮 onclick grails 显示列表
【发布时间】:2011-12-07 09:17:20
【问题描述】:

我有一个动态显示的列表,通过选择第一个列表中的项目,第二个列表中的项目将被填充(使用 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" />&nbsp;<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>

我想在列表框旁边有一个按钮,单击它后我想在下面添加另一组列表框。

我尝试了按钮的onclick事件,但它似乎无法正常工作。

任何更好的想法都会有所帮助。

----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>

它没有按预期工作。任何输入都会有很大帮助

【问题讨论】:

  • 这是一个关于javascript的问题,所以请出示你的javascript代码
  • 修改了代码,请看一下
  • "...但它似乎无法正常工作。" - 请更具体地说明什么不起作用。您是否收到任何 javascript 控制台错误? javascript 函数中的alert() 会触发吗?您是否在控制器端收到请求并查看日志? “工作不正常”并没有给我们太多的工作空间。
  • fileInfo 值已作为空传递,因此 file.fileName 已显示为无此类属性...抱歉回复晚了..昨天是 EOD,我刚开始回来,感谢您的回复

标签: javascript grails


【解决方案1】:

对于初学者,您需要避免内联事件注册(即使用 onclick="" 在 html 中注册事件处理程序)。

这混合了结构标记 (HTML) 和行为 (JS),这是糟糕的设计。

所以,而不是

<input type="button" value="Add a Device" onClick="deviceInfo('${i}','fileInfo','files','manufacturers')" />

只需像这样在 HTML 中给你的按钮元素一个 id

<input id="mybutton" type="button" value="Add a Device" />

然后使用 jQuery 之类的库来注册事件处理程序,如下所示:

jQuery( '#mybutton').click( function(){deviceInfo( ... )} );

【讨论】:

  • 嗨,感谢您的回复...但我不想在我的项目中仅将 jquery 用于此目的,因为它在 groovy 和 grails 中...所以去了 JS
  • 但是 jquery is JS,它只是一个建立在 vanilla javascript 之上的库,为处理 DOM 元素提供了一个很好的接口——在这种情况下,例如,注册一个按钮元素上的事件处理程序。
  • 如果你真的需要避免使用 jquery,你可以通过在 DOM 中找到你的元素(同样使用 jQuery 更容易)并设置 element.onclick = handlerFunction,在纯 JS 中注册一个 onclick 事件处理程序。正如其他人所说,一旦调用处理程序,问题可能是您的 javascript 中的错误,这实际上只是一个附带问题 - 但值得注意!
【解决方案2】:

我同意davnicwil - 你的内联代码将被证明是可维护源代码的糟糕做法。 IMO jQuery 是要走的路,但如果您真的不想去那里,请在脚本元素中创建一个 javascript 函数以增加可读性。如...

<r:script>
  function someButtonClick() {
    // You can still access your grails data 
  }
</r:script>

如果您没有 javascript 调试器,请在 View->Developer->JavaScript Console 下尝试 Chrome 附带的调试器。您可以设置断点、检查页面上的元素以及所有网络流量。

【讨论】:

    【解决方案3】:

    我可以通过包含 div 和实现 ajax 来解决这个问题。(这里是代码)

    <td><input type="button" value="Add a Device" onClick="deviceInfo('${i}')" /></td>
    
    function deviceInfo(id) {
    alert("hi, in deviceInfo function .... ");
    new Ajax.Updater(
                "deviceInfo." + id,
                "/wizard/submission/ajaxGetDevicesInfo", {
                    method:'get',
                    parameters: {
                        selectedValue : $F("manufacturers." + id),
                        id: id
                    }
                }
            );
    
    }
    

    控制器方法

    def ajaxGetDevicesInfo = {

        Submission submission = (Submission) session[getSessionObjectName()];
        OperatingSystem os = OperatingSystem.get(submission.getOperatingSystemId());
        def manufacturers = terminalService.getAllDeviceManufacturersForType(os.getType());
        terminalService.getDevicesForManufacturerAndType(params.selectedValue, type);
        render(template:"deviceInfo", model : ['id': params.id, 'manufacturers': manufacturers])
    
    }
    

    实现div的模板

    <g:select name="manufacturers.${id}" from="${manufacturers}" onChange="updateDevices('${id}')"  noSelection="${['null':'Select a manufacturer']}" value="" />
    </td>
    <td>
    <g:select from="${devices}" name="devices.${id}" value="" noSelection="${['null':'Select Devices']}" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2017-12-08
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多