<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 here的复选框示例代码。
当我单击命令按钮时,根据列表框值,它会生成一个表格结果,我在h:panelGrid id="result_table"
中显示。此命令按钮有效。在生成的表中,我有一些我想要显示的子表,但只有在我选中该框才能显示它们。对于我使用render="@form"
的复选框,它会折叠我的外部父表。如果我使用render="inner"
检查/取消选中框则不执行任何操作。
我如何让它工作?是因为这两个ajax发生了冲突吗?
仅供参考,我也尝试使用bean属性,但得到的结果相同。当我尝试使用同一链接中提到的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>
答案 0 :(得分:3)
罪魁祸首在这里:
<h:panelGrid id="inner" rendered="#{not empty showMore.value and showMore.value}">
<table></table>
</h:panelGrid>
f:ajax
使用JavaScript来定位客户端要呈现的元素。当JavaScript没有呈现给客户端时,JavaScript将无法找到inner
panelgrid的HTML表示。将inner
id放在父组件中,而不是始终呈现给客户端,这样无论rendered
条件如何,Ajax / JavaScript都可以找到它。 E.g:
<h:panelGroup id="inner">
<h:panelGrid rendered="#{not empty showMore.value and showMore.value}">
<table></table>
</h:panelGrid>
</h:panelGroup>
更新:根据评论,使用ui:repeat
不应该在此处形成问题。更重要的是,为了确保我已经将你的例子复制到我的游乐场环境中并且工作正常(在Tomcat 6.0.29上使用Mojarra 2.0.3)。这个bean标记为@ViewScoped
。也许你的是@RequestScoped
并且ui:repeat
的值的加载是基于某个请求作用域条件,后来的ajax调用中没有保留这些条件?
@ViewScoped
- 解释了@ViewScoped