【问题标题】:Nested ajax in JSF and ui:repeatJSF 和 ui:repeat 中的嵌套 ajax
【发布时间】:2011-05-16 06:35:41
【问题描述】:
<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 方法时,但选中/取消选中该框无效。

更新为在上面添加示例 sn-p 和 &lt;ui:repeat&gt;&lt;/ui:repeat&gt;

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

【问题讨论】:

  • 我很难在代码中看到问题并将其与您的问题信息相关联。你不是把代码 sn-p 过分简化了吗?我希望result_table 左右有另一个rendered 属性。考虑发布完整的工作 SSCCE 以 XHTML 文件和托管 bean 的形式,其中包含重现问题所需的最少必要代码。
  • 不幸的是,我的代码在 Intranet 上的另一台计算机上,我无法发布完整的代码。我更改了代码并重新措辞了问题,希望它更清楚。
  • 啊,对,您在原始示例中省略了id="inner"。现在你的意思更清楚了。

标签: java ajax jsf jsf-2 facelets


【解决方案1】:

罪魁祸首在这里:

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

f:ajax 使用 JavaScript 在客户端定位要渲染的元素。当 JSF 未将 inner panelgrid 呈现给客户端时,JavaScript 将无法找到它的 HTML 表示。将 inner id 放在父组件中,而不是始终呈现给客户端,以便 Ajax/JavaScript 可以定位它,而不管 rendered 条件如何。例如:

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

更新:根据 cmets,在这里使用 ui:repeat 应该不会造成问题。更重要的是,为了确保我已将您的示例复制粘贴到我的游乐场环境并且它工作正常(在 Tomcat 6.0.29 上使用 Mojarra 2.0.3)。顺便说一下,该 bean 标记为 @ViewScoped。也许你的是@RequestScoped,而ui:repeat 的值的加载是基于一些请求范围的条件,而这些条件在随后的ajax 调用中没有保留?

另见:

【讨论】:

  • 是的,就是这样!谢谢你。我将 bean 更改为 @ViewScoped 并且它起作用了。我应该阅读为我的 bean 设置正确的范围。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2012-07-11
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多