Jsf 如何在p:tabView组件中动态添加和删除选项卡

Jsf 如何在p:tabView组件中动态添加和删除选项卡,jsf,dynamic,primefaces,tabview,Jsf,Dynamic,Primefaces,Tabview,我正在尝试添加一个素数。添加第二个选项卡时,我遇到以下异常: java.lang.IllegalStateException:在视图中已找到组件ID tab0 我怎样才能解决这个问题 以下是查看代码: <h:form prependId="false"> <p:tabView id="tabview" dynamic="true" cache="false" binding="#{testBean.tabView}" activeIn

我正在尝试添加一个素数。添加第二个选项卡时,我遇到以下异常:

java.lang.IllegalStateException:在视图中已找到组件ID tab0

我怎样才能解决这个问题

以下是查看代码:

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

这是因为正在为您添加的新选项卡生成相同的ID。要避免这种情况,请在id后面附加一个变量,如下所示


如果一切都可以在视图中完成,则不要手动创建组件。如果bean位于比请求范围更广的范围内,则此构造将失败。另见例如

遵循showcase示例,该示例允许您通过sane模型和类似as/的方式动态填充选项卡

例如,这一观点

{tab.content} 用这个控制器

@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;
    }

}

看来id管理得不好。例如,你能发布更多的id代码声明吗?BWT,如果你想保持在同一页tabtest.jsf,你的方法可以返回void。@janasoft:如果现在已经解决了,你能告诉我们你是如何解决这个问题的吗?这可以通过使用difeerent id来实现。你能告诉我投票的原因吗。分享你的代码太棒了,我不知道标签可以这样生成+1.
<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>  
@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;
    }

}