如果选项卡是从后台bean生成的,则TabCloseEvent不会被触发。TabCloseEvent在正常的xhtml制表符中工作得很好。
我的代码
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Test Title</title>
</h:head>
<h:body>
<h:form id="form">
<p:growl id="growl" showDetail="true" />
<p:tabView id="tabview"
value="#{TestBean.tabList}"
var="tab"
widgetVar="tabviewV">
<p:ajax event="tabClose" listener="#{TestBean.onTabCloseAction}" update=":form:growl"/>
<p:tab id="tab" title="#{tab}" closable="true" >
<h:outputText value="#{tab}"/>
</p:tab>
</p:tabView>
</h:form>
</h:body>
</html>
被管理bean
@ManagedBean(name = "TestBean")
@ViewScoped
public class TestBean {
private List<String> tabList = new ArrayList<String>();
public TestBean() {
tabList.add("Test Tab 1");
tabList.add("Test Tab 2");
tabList.add("Test Tab 3");
tabList.add("Test Tab 4");
}
public void onTabCloseAction(TabCloseEvent event) {
System.out.println("Tab Closed Event : " + event.getTab().getTitle());
FacesMessage msg = new FacesMessage("Tab Closed", "Closed tab: " + event.getTab().getTitle());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public List<String> getTabList() {
return tabList;
}
public void setTabList(List<String> tabList) {
this.tabList = tabList;
}
}
我正在使用Primefaces 5.0。我也尝试使用process="@this"在边p:ajax,但结果是相同的。
我尝试了在展示中提到的方式以及在您的代码中,但不能完全工作,所以我尝试了另一种方法,让我们看看
Facelets <p:growl id="growl" showDetail="true" />
<p:tabView id="tabView" binding="#{homeBean.tabView}" >
<p:ajax event="tabClose" listener="#{homeBean.onTabClose}" update=":form:growl"/>
</p:tabView>
托管Bean
private TabView tabView = new TabView();
Tab tab1 = new Tab();
tab1.setClosable(true);
tab1.setTitle("Business Partner");
Tab tab2 = new Tab();
tab2.setClosable(true);
tab2.setTitle("Manage Favorites");
tabView.getChildren().add(tab1);
tabView.getChildren().add(tab2);
现在似乎起作用了。注意:我使用的是Primefaces 5.0
这是一个已知的bug。
已在5.0.2版本中修复。
所以你应该更新你的库到5.0.2或5.0.3