jan*_*oft 4 jsf dynamic primefaces tabview
我正在尝试<p:tab>动态添加PrimeFaces .在添加第二个选项卡时,我收到以下异常:
"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>
Run Code Online (Sandbox Code Playgroud)
这是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";
}
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 11
如果只能在视图中完成所有操作,请不要手动创建组件.如果bean的范围比请求范围更广,则此构造将失败.另请参见例如Binding属性导致在视图中找到重复的组件ID
按照展示示例" TabView with Model ",它允许您通过合理的模型动态填充标签,<p:tabView value="..." var="...">如<ui:repeat>/ <h:dataTable>.
比如这个观点
<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>
Run Code Online (Sandbox Code Playgroud)
用这个控制器
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
而这个模型
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为正在为新选项卡(您添加的选项卡)生成相同的 ID。为了避免这种情况,请将变量附加到idas
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18704 次 |
| 最近记录: |