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>