0

私のjsfページには<p:treeTable>構造があります。列の1つに配置された小さなアイコンをクリックすると、ノードを削除しようとしています:

<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 が提供するショーケースに似ています。ただし、ツリーは 2 回目のクリックでのみ更新され、次の例外が発生します。

[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 に答える