JSF h: commandButton не работает с ajax - PullRequest
2 голосов
/ 19 сентября 2011

Это релевантная часть моего кода (я пытаюсь добавить компонент расписания на портал моей школы):

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

Командные ссылки работают нормально, а команда «сохранить» commandButton - нет.Это не «визуализированный» атрибут, я пробовал без него, тоже самое.Дело в том, что он вообще не срабатывает, XHR не генерируется, кнопка не работает.Я пробовал разные комбинации, даже установив для атрибута render значение @all.Еще ничего.В прошлый раз, когда я спрашивал о чем-то, касающемся commandButton и ajax, я спешил, так что в конце концов я обошел это, но на этот раз я хотел бы докопаться до сути.: D

1 Ответ

1 голос
/ 19 сентября 2011

Отказ от ответственности: я не пытался воспроизвести это локально, потому что это слишком много кода и не соответствует SSCCE

Однако я знаю, что, когда у вас есть несколько форм ajax, которые отображают друг друга с помощью общего / общегородительского идентификатора, то любая отправка формы other в последующем запросе завершится неудачей, поскольку состояние представления не добавляется как скрытое поле после повторной визуализации JS.Но, если это так, то вторая попытка представить его должна сработать.Возможно, в истории есть что-то еще, но для начала вам нужно явно указать идентификатор другой формы в атрибуте render <f:ajax>.

Сделайте это для обоих тегов <f:ajax> внутри первой формы:

<f:ajax render=":sc-timetable-slots :sc-timetable-slots-edit" onevent="reRender"/>

В вашем конкретном случае :sc-timetable-slots-edit - это идентификатор другого form.

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...