【问题标题】:JSF rich tree + AJAXJSF富树+AJAX
【发布时间】:2012-07-03 16:35:49
【问题描述】:

我有一棵丰富的树,它包含的节点很少。我在每个节点旁边都有一个复选框。当我选中一个复选框时,需要选中与所有子项相关的复选框,而当我取消选中所有子项时,必须取消选中。我的 xhtml 中有以下代码。在 backing bean 中,我根据事件将所有子项设置为选中/未选中。树最初处于“折叠”模式。当我单击复选框并展开节点时,我可以看到所有子项都被选中。但是当我在扩展模式中取消选中/检查时,这些值不会反映在子元素中。你能帮我知道我错过了什么吗?谢谢。

    <rich:tree id="producttree" switchType="server"
        value="#updateProductBean.deviceServiceTreeRoot}" var="item">
        <rich:treeNode id="productnode">
            <h:selectBooleanCheckbox value="#{item.selected}"
                rendered="#{item.value == null &amp;&amp; item.checkbox == true}"
                valueChangeListener="#{updateProductBean.submitUpdateProduct}">
                <f:attribute name="selectedProductId" id="selectedProductId"
                    value="#{item.paramID}" />
                <f:attribute name="selectedProductName" id="selectedProductName"
                    value="#{item.name}" />
                <a4j:support event="onclick" reRender="producttree,productnode">
                </a4j:support>
            </h:selectBooleanCheckbox>
            <h:outputText value="#{item.name}" rendered="#{item.value == null}" />
        </rich:treeNode>
    </rich:tree>

【问题讨论】:

  • 我猜它的重新渲染问题。你确定选中复选框后树会重建吗?
  • 感谢您的回复 Ellie - 我不确定这棵树是否正在完全重建。我添加了与复选框“选定”属性有关的布尔变量作为输出文本。对于我正在检查的复选框,此值正在更改 - 但不确定是否重新渲染了 chold 元素。

标签: jsf richfaces jsf-1.2


【解决方案1】:

尝试将您的h:selectBooleanCheckBox 包装在a4j:outputPanel 标记中,然后定义一个ID 名称,然后在您的a4j:support 标记上重新呈现此a4j:outputPanel。如果仍然没有重新渲染,请尝试将 ajaxRendered="true" 放在您的 a4j:outputPanel 上,这将使其始终针对每个 ajax 请求进行更新。

试试这个。

<rich:tree id="producttree" switchType="server"
                value="#updateProductBean.deviceServiceTreeRoot}" var="item">
                <rich:treeNode id="productnode">
                    <a4j:outputPanel id="panel" ajaxRendered="true">
                        <h:selectBooleanCheckbox value="#{item.selected}"
                            rendered="#{item.value == null &amp;&amp; item.checkbox == true}"
                            valueChangeListener="#{updateProductBean.submitUpdateProduct}">
                            <f:attribute name="selectedProductId" id="selectedProductId"
                                value="#{item.paramID}" />
                            <f:attribute name="selectedProductName" id="selectedProductName"
                                value="#{item.name}" />
                            <a4j:support event="onclick"
                                reRender="producttree,productnode, panel">
                            </a4j:support>
                        </h:selectBooleanCheckbox>
                    </a4j:outputPanel>
                    <h:outputText value="#{item.name}"
                        rendered="#{item.value == null}" />
                </rich:treeNode>
            </rich:tree>

【讨论】:

  • 嗨,Ellie,试过了,但这并没有更新与子元素相关的复选框:(
  • 尝试检查节点内复选框的值是否已更新,并且树是否正确重建。因为它在折叠模式下工作。
  • 我尝试在检查/取消检查时调用的方法 (submitUpdateProduct) 中打印支持 bean 内的复选框的值。我根据是否选中父复选框将所有子元素的值显式设置为 true 或 false。值设置正确。如何确保正确重建树?感谢您的所有帮助。
  • 你可以使用 change switchType="ajax",因为你使用的是 a4j:support 这意味着它是在 ajax 请求时触发的。我将尝试根据您的代码创建自己的示例,看看它是否适用于我的代码。
  • 嗨,Ellie,当我在 backing bean 中将树设置为 null 时,问题得到了解决。之后,树被正确渲染。感谢你的帮助!!顺便说一句 - 给了你赏金:)
【解决方案2】:

它呈现您单击树的整个一个级别,因此如果您有任何 ajax 调用,那么它将调用第一个节点并跳过休息。整个故事正在映射整个关卡。

【讨论】:

  • 为了清楚起见,您可以考虑重新表述您的答案并举例说明您的观点
猜你喜欢
  • 2013-03-27
  • 2011-07-26
  • 2011-10-14
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2013-11-07
  • 2014-03-12
相关资源
最近更新 更多