Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 ui:在o:树中重复未按预期工作_Jsf 2_Tree_Omnifaces_Uirepeat - Fatal编程技术网

Jsf 2 ui:在o:树中重复未按预期工作

Jsf 2 ui:在o:树中重复未按预期工作,jsf-2,tree,omnifaces,uirepeat,Jsf 2,Tree,Omnifaces,Uirepeat,我正在使用一个“分支”列表,其中每个分支都有一个属性为“颜色”的“叶子列表”,该属性在树中应该是可编辑的 - branch 0 - leaf 0 (color = "green") - leaf 1 (color = "yellow") - branch 1 - leaf 0 (color = "purple") - branch 1_0 - leaf 1 (color = "red") - leaf 2 (color = "orange") - leaf

我正在使用一个“分支”列表,其中每个分支都有一个属性为“颜色”的“叶子列表”,该属性在树中应该是可编辑的

- branch 0
  - leaf 0 (color = "green")
  - leaf 1 (color = "yellow")
- branch 1
  - leaf 0 (color = "purple")
  - branch 1_0
    - leaf 1 (color = "red")
    - leaf 2 (color = "orange")
    - leaf 3 (color = "brown")
添加/删除分支和向任何分支添加叶效果良好,符合预期。此外,任何复杂树(包括所有叶列表)的渲染(显示具有正确值的颜色属性)的工作方式与charme类似

但是更改颜色或删除叶子(因此
ui:repeat
中的任何内容)只对最后渲染的分支起预期作用。

其他叶/分支的“颜色”输入字段根本不起作用,
ui:repeat
中的delete leaf链接也不起作用,因为removeLeaf(…)中的叶属性总是传递上一个渲染分支的对应叶。 因此,在上述示例中,单击分支0的黄色叶的delete将调用removeLeaf(橙色,分支0),它将不会删除任何内容,因为分支0没有橙色叶

这是绑定到基本部分的代码-如果需要,可以提供任何其他内容:

<h:form>
  <o:tree value="#{treeBean.tree}" var="branchEntity" varNode="branchNode">
    <o:treeNode>
      <o:treeNodeItem>
        <ui:repeat value="#{branchEntity.leafList}" var="leaf">
          <h:panelGrid columns="2">     
            <p:inputText value="#{leaf.color}" />   
            <p:commandLink action="#{treeBean.removeLeaf(leaf, branchEntity)}" styleClass="ui-icon ui-icon-trash"
                        process="@form" update="@form" />               
          </h:panelGrid>
        </ui:repeat>    

        <p:commandLink action="#{treeBean.addLeaf(branchEntity)}" styleClass="ui-icon ui-icon-plus"
                process="@form" update="@form" />
        <o:treeInsertChildren />
      </o:treeNodeItem>
    </o:treeNode>
  </o:tree>
  <p:commandButton id="save" value="Save" action="#{treeBean.save}" process="@form" update="@form" />
</h:form>
treeBean.save()方法只是将整个Tree.toString()记录到控制台,其结果如下:

[Branch [leafList=[Leaf [color=null], Leaf [color=null]]],
Branch [leafList=[Leaf [color=null]]]
[Branch [leafList=[Leaf [color=red], Leaf [color=orange], Leaf [color=brown]]]]]
如果颜色有价值!=null之前,该值保持不变-因此不会被null覆盖。我对JSF的了解还不够深入,无法真正了解如何调查信息在途中丢失的地方


(我最初在JBoss EAP 6.2+Primefaces 5.2+Omnifaces 2.1上使用Mojarra 2.1.19,但在Mojarra 2.2.12、TomEE、Primefaces 5.3+Omnifaces 2.2上也有同样的体验。可以找到完整的Maven Eclipse示例项目,我甚至直接向分支添加了一个更简单的字符串属性(没有列表),效果很好。)这确实是由
中的状态管理错误引起的。它没有正确地识别自己被嵌套在另一个迭代器中,并且在父迭代器的每次迭代期间被重新访问之前,顽固地清除了状态。它识别父级
UIRepeat
UIData
,但仅此而已。
没有也不能从
UIData
扩展,
UIRepeat
不幸地是一个特定于实现的类,因此不能公开使用,只要您想独立于特定的JSF实现(Mojarra、MyFaces等)

最好的选择是用真正的
UIData
组件替换
,该组件具有更好的状态管理实现。我刚刚在这里尝试过,添加项目对我来说非常适合
。仅删除项目在
中失败,因为它呈现了错误的客户端ID。它没有考虑容器客户端ID。
在添加和删除项目的两种情况下都适用于我。仍然更新列表中任何绑定输入字段的服务器端模型失败,如本答案注释中详细讨论的

将整个
替换为
(如果没有
类型
,它将呈现一个
)是最接近的

<p:dataList type="none" value="#{branchEntity.leafList}" var="leaf">
    ...
</p:dataList>

...

如果JSF提供了一个类似于UIRepeat(标记)的公共接口,那么这个世界就会简单得多。所有的中继器在管理状态时都可以检查这个接口。

那么您提交了JSF 2.4增强功能?;-)或者你或者Arjen能偷偷地把它放进2.3吗?;-)它肯定在我们的2.3愿望列表中。谢谢快速回答。但实际上这对我不起作用。对于
h:dataTable
来说,事情开始变得非常疯狂。例如,removeLeaf链接被调用n次,并从任何分支中删除所有(第一个)叶子。如果我查看生成的html,deleteLeaf链接的id看起来像
hForm:oTree:hDataTable:0:removeLeaf
。当我使用
p:dataList
时生成的相同id看起来像
hForm:oTree:1\u 0:pDataList:0:removeLeaf
,并且工作正常。但是输入文本仍然不起作用
ui:repeat
h:dataTable
p:dataList
的行为完全不同,但与我希望的不同。事实上,
在添加项目时工作,但在删除项目时失败。然而,
对我来说是正确的。我会更新答案。inputText究竟是如何失败的?我使用了Mojarra 2.2.12+PrimeFaces 5.3。我没有注意到我可以点击这个微小的+。你说得对,我现在可以重现你的问题了。很抱歉给您带来不便。回到具体问题,它看起来像是
p:dataList
毕竟有着与
ui:repeat
相同的问题:没有将
o:tree
识别为迭代器组件。
<p:dataList type="none" value="#{branchEntity.leafList}" var="leaf">
    ...
</p:dataList>