JSF h:commandButton不会使用ajax触发

时间:2011-09-19 15:07:10

标签: java ajax jsf

这是我的代码的相关部分(我正在尝试将时间表组件添加到我学校的门户网站):

<h:panelGroup layout="block" id="sc-timetable-slots" styleClass="traverse ui-helper-clearfix">
                    <h:form id="sc-timetable-slots-table" styleClass="sc-left-bulk ui-widget-content">
                        <div class="sc-8-column">
                            <h:panelGroup layout="block" styleClass="sc-hours">
                                <ul>
                                    <li class="ui-widget-header"><h:outputText value="H" /></li>
                                    <c:forEach begin="4" end="24" var="h">
                                        <li>#{h}:00</li>
                                    </c:forEach> 
                                </ul>
                            </h:panelGroup>
                        </div>
                        <ui:repeat value="#{timetableSlot.dow}" var="dow" varStatus="ix">
                            <div class="sc-8-column">
                                <h:panelGroup layout="block" styleClass="sc-timetable-slots">
                                    <ul>
                                        <li class="ui-widget-header"><h:outputText value="#{msg[dow]}"/></li>
                                        <ui:repeat value="#{timetableSlot.getSlots(login.person,ix.index)}" var="slot">
                                            <li class="sc-timetable-item">
                                                <h:commandLink action="#{timetableSlot.edit(slot)}" value="#{slot.timeStart} : #{slot.timeEnd}" styleClass="sc-button incomplete">
                                                    <f:ajax render=":sc-timetable-slots" onevent="reRender"/>
                                                </h:commandLink>
                                            </li>
                                        </ui:repeat>
                                        <li>
                                            <h:commandLink action="#{timetableSlot.edit(login.person,ix.index)}" value="#{msg['timetable.slots.new']}" styleClass="sc-button incomplete">
                                                <f:ajax render=":sc-timetable-slots" onevent="reRender"/>
                                            </h:commandLink>
                                        </li>
                                    </ul>
                                </h:panelGroup>
                            </div>
                        </ui:repeat>
                    </h:form>
                    <h:form id="sc-timetable-slots-edit" styleClass="sc-right-detail ui-widget-content" rendered="#{not empty timetableSlot.edited}">
                        <span class="traverse ui-widget-header">#{msg['timetable.slots.edit']}</span> 
                        <h:panelGrid styleClass="traverse" columns="2">
                            <h:outputLabel for="timeStart" value="#{msg['timetable.slots.start']}"/>
                            <h:inputText id="timeStart" value="#{timetableSlot.edited.timeStart}"/>
                            <h:outputLabel for="timeEnd" value="#{msg['timetable.slots.end']}"/>
                            <h:inputText id="timeEnd" value="#{timetableSlot.edited.timeEnd}"/>
                            <h:commandButton type="submit" styleClass="sc-button incomplete" action="#{timetableSlot.save}" value="#{msg['nav.save']}">
                                <f:ajax render=":sc-timetable-slots" onevent="reRender"/>
                            </h:commandButton>
                        </h:panelGrid>                            
                    </h:form>
                </h:panelGroup>

commandLinks工作正常,但“save”commandButton没有。这不是“渲染”属性,我尝试没有它,同样。问题是,它根本不会触发,没有生成XHR,按钮已经死了。我尝试了不同的组合,甚至将“render”属性设置为“@all”。依然没有。我最后一次询问涉及commandButton和ajax的事情时,我很着急所以我最终解决了这个问题 - 但这次我想深究它。 :d

1 个答案:

答案 0 :(得分:1)

免责声明:我没有尝试在本地重现,因为代码太多而不是SSCCE值得

但是,我知道当你有多个ajax表单通过一般/公共父ID互相呈现时,后续请求中任何其他表单的提交都将失败,因为视图状态在JS重新渲染后,不会附加为隐藏字段。但是,如果是这种情况,那么提交它的第二次尝试应该可行。也许故事还有更多内容,但首先,您需要在render的{​​{1}}属性中明确指定其他表单的ID。

对第一个表单中的<f:ajax>个标记执行此操作:

<f:ajax>

在您的特定情况下,<f:ajax render=":sc-timetable-slots :sc-timetable-slots-edit" onevent="reRender"/> 其他表单的ID。

另见: