0

在我的 jsf 页面中,我有一个<p:treeTable>结构。单击放置在其中一列上的小图标时,我试图删除一个节点:

<p:column rendered="#{node.isLeaf}"  style="width:70px">  
     <p:commandLink  styleClass="entity-icon"  update=":clipboard-tree" ajax="true"
                          action="#{clipboardManager.removeClipboard(node)}" >
       <p:graphicImage value="/resources/images/delete.png" styleClass="entity-icon-tree"/>
    </p:commandLink>
 </p:column>

我的 removeClipboard 函数看起来像这样:

public void removeClipboard(FindResult result){
  TreeNode node = result.getNode(); 

  node.getChildren().clear();  
  node.getParent().getChildren().remove(node);  

  node.setParent(null);  
  node = null;  

}

这类似于 primefaces 提供的展示。然而,树只在第二次点击时更新,我得到以下异常:

[Index: 0, Size: 0] with root cause java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

仅当我尝试删除节点的最后一个子节点时才会发生这种情况。有人知道为什么会这样吗?或者我该如何解决?先感谢您。

4

2 回答 2

0

我正在遭受同样的问题。在进行 ajax 调用后重新验证组件模型时,Primefaces 似乎存在问题。我注意到的奇怪的事情是,这只发生在删除元素的过程中。

我发现的解决方法是为删除操作禁用 ajax。在上面给出的示例中,如下所示:

<p:column rendered="#{node.isLeaf}"  style="width:70px">  
  <p:commandLink
    styleClass="entity-icon"
    update=":clipboard-tree" 
    ajax="false" <!-- this one to 'false' -->
    action="#{clipboardManager.removeClipboard(node)}">
    <p:graphicImage value="/resources/images/delete.png" styleClass="entity-icon-tree"/>
  </p:commandLink>
</p:column>

不幸的是,以下完整的页面重新加载对于可用性来说并不是最好的。

于 2013-04-23T10:49:54.110 回答
0

万一其他人有这个问题,我找到了解决方法。这并不理想,但没有其他更好的主意。

鉴于错误消息仅针对节点的最后一个子节点显示,我更改了树的生成方式,使添加的最后一个元素始终为空节点。

这样我的父节点之间就有了一个很好的间距,我可以删除最后一个节点而不会出错。希望这可以帮助。

于 2012-11-09T10:05:33.753 回答