使用以下代码,tabChange事件清除了两个选项卡的内容,而不是更新:
<h:form id="form">
<p:tabView id="tabview">
<p:ajax event="tabChange" listener="#{testBean.onChange}" update="@form"/>
<p:tab title="Tab 1">
<h:outputText value="Lorem ipsum dolor sit amet." id="ht1"/>
</p:tab>
<p:tab title="Tab 2">
<h:outputText value="Donec et mi et arcu commodo hendrerit." id="ht2"/>
</p:tab>
</p:tabView>
</h:form>
onChange方法是一个空方法,是我的测试代码。
我在这里遗漏了一些东西,但我找不到什么。我究竟做错了什么?
修改
我正在使用ViewScoped bean。
我已尝试update="@form"
,update=":form"
和update=":form:tabview"
,同样的问题也出现了。
如果我使用update="ht1, ht2"
,我的onChange方法中的一切都很好但,我想以编程方式选择我想要激活的标签(我的实际代码中有一个处理方法)验证一些数据:如果验证失败,我想留在选项卡1,如果没问题,请转到选项卡2)。为此,我想我必须更新整个tabview组件,而不仅仅是标签的内容。但也许我错了?
完整代码
我做了一些更改,这是我的更新代码仍然不起作用。
管理bean:
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.TabChangeEvent;
@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
private int idx;
private String s1 = "test 1";
private String s2 = "test 2";
public TestBean() {
System.out.println("TestBean.init");
}
public void onChange(TabChangeEvent e){
s1 = "TEST TEST";
s2 = "TEST TEST";
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS2() {
return s2;
}
public void setS2(String s2) {
this.s2 = s2;
}
}
的facelet:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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>Facelet Title</title>
</h:head>
<h:body>
<h:form id="form">
<p:tabView id="tabview" activeIndex="#{testBean.idx}">
<p:ajax event="tabChange" listener="#{testBean.onChange}" update="@form"/>
<p:tab title="Tab 1">
<h:outputText value="#{testBean.s1}" id="ht1"/>
</p:tab>
<p:tab title="Tab 2">
<h:outputText value="#{testBean.s2}" id="ht2"/>
</p:tab>
</p:tabView>
<h:messages/>
</h:form>
</h:body>
</html>
更新
我将我的Primefaces jar从3.4改为3.2和魔法,这种行为不再发生了。我尝试用3.3和繁荣,错误。我将在Primefaces论坛上询问这是否是一个已知错误。
答案 0 :(得分:6)
你应该使用activeIndex
<p:tabView id="tabview" activeIndex="#{testBean.tabIndex}" >
在你的onchange方法中,验证后设置正确的tabindex。
答案 1 :(得分:2)
绑定activeIndex
属性是不够的。您还必须触发AJAX提交以更新服务器上的值。所以它应该是:
<p:tabView activeIndex="#{bean.index}">
<p:ajax event="tabChange" />
</p:tabView>