当前位置: 首页 > 知识库问答 >
问题:

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

谭兴学
2023-03-14

我使用的是一个omnifaces o:tree of“Branchs”,其中每个分支都有一个属性为“color”的“叶列表”,该属性在树中应该是可编辑的。

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

我知道嵌套的ui:重复有一些问题,但是因为我在Mojarra 2.1.19上,我想这里不是这样。实际上,嵌套两个ui:重复工作正常,如果我用一个ui:重复替换o: Tree,它迭代一个分支列表。但是后来我显然失去了我需要的树功能。我刚刚测试了这个来验证嵌套ui:重复的正常工作。

这个问题似乎与另一个问题相似,但并不完全相同。。。

如果我将内部的ui:repeat替换为p:dataList(正如解决ui:repeat问题的一些其他答案中所建议的,现在在这里的BalusC答案中也是如此),removeLeaf()链接将正常工作,但仍然只绑定最后一个分支的颜色输入字段。

更新:我现在有一个更仔细地看时,使用p: dataList。我从浏览器开发工具中获得的AJAX请求的POST内容看起来不错:

javax.faces.partial.ajax=true
javax.faces.source=hForm:save
javax.faces.partial.execute=hForm
javax.faces.partial.render=hForm
hForm:save=hForm:save
hForm=hForm
hForm:oTree:0:pDataList:0:color=green
hForm:oTree:0:pDataList:1:color=yellow
hForm:oTree:1:pDataList:0:color=purple
hForm:oTree:1_0:pDataList:0:color=red
hForm:oTree:1_0:pDataList:1:color=orange
hForm:oTree:1_0:pDataList:2:color=brown
javax.faces.ViewState=-6137230173999059936:-6718691551411872927

树人。save()方法只是记录整个树。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的了解还不够深入,无法真正了解如何调查信息在途中丢失的地方。

(我最初使用Mojarra 2.1.19在JBoss EAP 6.2 Primeface5.2 Omniface2.1上,但在Mojarra 2.2.12,TomEE,Primeface5.3 Omniface2.2上体验完全相同。完整的Maven Eclipse示例项目可以在这里找到我添加了一个更简单的字符串属性(没有列表)直接到分支,工作正常。(

共有1个答案

太叔坚
2023-03-14

这确实是由

您最好的选择是替换

更换整个

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

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

 类似资料:
  • 我目前正试图研究并发性,特别是“volatile”关键字。 通过声明计数器变量为volatile,所有对计数器变量的写入都将立即写回主存。此外,计数器变量的所有读取都将直接从主存中读取。下面是计数器变量的volatile声明的外观 和 当线程写入易失性变量时,不仅易失性变量本身会被写入主内存。此外,线程在写入易失性变量之前更改的所有其他变量也会刷新到主内存中。当一个线程读取一个易失性变量时,它还将

  • 我有一个数组,我试图删除数据的基础上,但部分数据被拉出和值填充的地方。 大堆 现在我想提取这些数据 完全基于 更新的命令: 请暂时忽略括号。目前在我得到的输出中 控制器中的代码:

  • 我正在解决反向字符串问题。我想知道为什么交换2 char的帮助函数在我的代码中不起作用。但如果我在while循环中编写交换代码,它就可以工作。

  • 我需要使用“;”拆分字符串作为分隔符,如果字符串中所有的字段都被填充了,这很好,但是如果一些字段没有被填充,比如< code > string . split(" A;b;c;;;")不起作用...对于这个字符串,我预计输出将 [0]=A [1] =B [2]=C [3]='' [4]='' [5]='' ,但输出只有前三个字段 [0]=A [1] =B [3]=C ...未创建其他字段 如何解决

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。