Вложенный AJAX в JSF и UI: повторить - PullRequest
3 голосов
/ 26 ноября 2010
<h:form>
    <fieldset>
        <h:selectManyListbox id="listbox" value="#{form.items}">
            <f:selectItems value="#{form.allItems}">
        </h:selectManyListbox>
    </fieldset>
    <h:commandButton value="Get Table" action="#{form.getTable}">
        <f:ajax render="result_table" execute="listbox" />
    </h:commandButton>
    <h:panelGrid id="result_table">
        <table>
            <thead></thead>
            <tbody>
                <ui:repeat var="table" value="#{form.resultTable}">
                    <tr>
                         <td>#{table.name}</td>
                         <td>
                             <h:selectBooleanCheckbox binding="#{showMore}">
                                 <f:ajax render="inner" />
                             </h:selectBooleanCheckbox>
                         </td>
                    </tr>
                    <tr>
                         <td>
                             <h:panelGrid id="inner" rendered="#{not empty showMore.value and showMore.value}">
                                 <table></table>
                             </h:panelGrid>
                         </td>
                    </tr>
                </ui:repeat>
            </tbody>
        </table>
    </h:panelGrid>
</h:form>     

Я следовал за примером кода флажка от BalusC здесь .

Когда я нажимаю командную кнопку, основываясь на значениях списка, она генерирует табличный результат, который я отображаю в h:panelGrid id="result_table". Эта командная кнопка работает. Внутри сгенерированной таблицы у меня есть несколько вложенных таблиц, которые я хочу отобразить, но только если я поставлю флажок, чтобы показать их. Для флажка, если я использую render="@form", он свернет мою внешнюю родительскую таблицу. Если я использую render="inner", отметка / снятие флажка ничего не делает.

Как мне заставить это работать? Это потому, что два аякса находятся в конфликте?

К вашему сведению, я также попытался использовать свойство бина, но получил тот же результат. Когда я пытался использовать метод javascript, упомянутый в той же ссылке, но установка / снятие флажка не имела никакого эффекта.

Обновлено для добавления примера фрагмента и <ui:repeat></ui:repeat> выше:

<h:selectBooleanCheckbox binding="#{showMore}">
     <f:ajax render="inner" />
 </h:selectBooleanCheckbox>
 <h:panelGrid id="inner">
     <h:outputText value="always" />
     <h:outputText value="hidden" rendered="#{not empty showMore.value and showMore.value}" />
 </h:panelGrid>

1 Ответ

3 голосов
/ 26 ноября 2010

Виновник здесь:

<h:panelGrid id="inner" rendered="#{not empty showMore.value and showMore.value}">
    <table></table>
</h:panelGrid>

f:ajax использует JavaScript для определения местоположения элемента, который будет отображаться на стороне клиента.JavaScript не сможет найти HTML-представление панели inner, если оно не отрисовывается на стороне клиента JSF.Вместо этого поместите идентификатор inner в родительский компонент, который всегда отображается на стороне клиента, чтобы Ajax / JavaScript мог найти его независимо от условия rendered.Например:

<h:panelGroup id="inner">
    <h:panelGrid rendered="#{not empty showMore.value and showMore.value}">
        <table></table>
    </h:panelGrid>
</h:panelGroup>

Обновление : согласно комментариям, использование ui:repeat не должно создавать проблем здесь.Более того, чтобы быть уверенным, что я скопировал ваш пример в мою игровую среду, он отлично работает (используя Mojarra 2.0.3 на Tomcat 6.0.29).Боб, кстати, помечен @ViewScoped.Может быть, у вас было @RequestScoped, а загрузка значения для ui:repeat была основана на некотором условии области запроса, которое не сохранялось при последующих вызовах ajax?

См. Также:

...