2011-09-05 43 views
4

PrimeFaces <p:tab>を動的に追加しようとしています。p:tabViewコンポーネントでタブを動的に追加および削除する方法

「java.lang.IllegalStateException::コンポーネントIDのTAB0が既にビューで発見された」私は次の例外を取得しています2つ目のタブを追加しています。

どうすればこの問題を解決できますか?ここ

は、ビューコードである:ここ

<h:form prependId="false"> 
    <p:tabView id="tabview" dynamic="true" cache="false" 
     binding="#{testBean.tabView}" 
     activeIndex="#{testBean.activeTab}" > 
     <h:commandButton value="Close" action="#{testBean.removeTab}"/> 
    </p:tabView> 
    <h:commandButton value="Add Tab" action="#{testBean.addTab}"/> 
</h:form> 

は、Beanコード:

public String addTab() { 
    String tabId="tab"+id; 
    System.out.println("Gen Id: "+tabId); 
    tab = new Tab(); 
    tab.setTitle("Title: "+tabId); 
    tab.setId(tabId); 

    System.out.println("Tab Id: "+tab.getId()); 
    tabView.getChildren().add(id,this.tab); 
    id++; 
    return "tabtest.jsf"; 
} 

public String removeTab() { 
    tabView.getChildren().remove(activeTab); 
    return "tabtest.jsf"; 
} 
+0

<h:form> <p:tabView value="#{bean.tabs}" var="tab"> <p:tab title="#{tab.title}"> #{tab.content} <p:commandButton value="Close" action="#{bean.remove(tab)}" update="@form" /> </p:tab> </p:tabView> <p:commandButton value="Add Tab" action="#{bean.add}" update="@form" /> </h:form> 

'id'がひどく管理されているようです。より多くのコードを掲示できますか(例えば、「id」の宣言)? BWTでは、同じページ 'tabtest.jsf'にとどまる場合、メソッドは' void'を返すことができます。 –

+0

@ janasoft:どうすればこの問題を解決することができましたか(今解決済みの場合) –

答えて

0

同じIDが新しいタブ(追加ウルもの)のために生成されているためです。これを避けるために、すべてがちょうどビューで行うことができる場合は、手動でコンポーネントを作成しないでくださいid

として
<p:tabView id="tabview_#{testBean.i}" dynamic="true" cache="false"binding="#{testBean.tabView}" 
     activeIndex="#{testBean.activeTab}" > 
     <h:commandButton value="Close" action="#{testBean.removeTab}"/> 
</p:tabView> 
+0

これは異なるIDを持つことによって動作します。これは有用ではないと投票した理由を教えてくれます。あなたのコードを共有する – Jerry

11

に変数を追加します。 Beanが要求スコープよりも広い範囲にある場合、この構文は失敗します。例えば、 Binding attribute causes duplicate component ID found in the view

はあなたが動的に<ui:repeat>/<h:dataTable>などのような正気モデルと<p:tabView value="..." var="...">経由タブを移入することができますショーケースの例「TabView with Model」を行います。

など。このビューこのコントローラ

@ManagedBean 
@ViewScoped 
public class Bean implements Serializable { 

    private List<Tab> tabs; 

    @PostConstruct 
    public void init() { 
     tabs = new ArrayList<>(); 
    } 

    public void add() { 
     tabs.add(new Tab("tab" + tabs.size(), "some content")); 
    } 

    public void remove(Tab tab) { 
     tabs.remove(tab); 
    } 

    public List<Tab> getTabs() { 
     return tabs; 
    } 

} 

し、このモデル

public class Tab { 

    private String title; 
    private String content; 

    public Tab(String title, String content) { 
     this.title = title; 
     this.content = content; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getContent() { 
     return content; 
    } 

} 
+0

偉大な、私はタブがそのように生成することができるか分からなかった! +1 – iozee

関連する問題