我正在使用Primefaces 3.5& JSF2.1(Mojarra)
我创建了一个primefaces(p:tabView id =“tabsVw”dynamic =“false”>),里面有两个标签,每个标签都有一个primefaces数据表
<h:form>
<p:tabView dynamic="false">
<p:ajax event="tabChange" listener="#{tstTab.onDtlTabChanged}" />
<p:tab title="tab1">
<p:dataTable value="#{tstTab.list1}" var="v1">
<p:column>
<h:outputText value="#{v1}"/>
</p:column>
</p:dataTable>
</p:tab>
<p:tab title="tab2">
<p:dataTable value="#{tstTab.list2}" var="v2">
<p:column>
<h:outputText value="#{v2}"/>
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</h:form>
并在bean内部(视图作用域)
@ManagedBean
@ViewScoped
public class TstTab {
private List<String> list1;
private List<String> list2;
public TstTab(){
list1 = new ArrayList<String>();
list2 = new ArrayList<String>();
list1.add("List 1 - Str 1");
list1.add("List 1 - Str 2");
list1.add("List 1 - Str 3");
list1.add("List 1 - Str 4");
list1.add("List 1 - Str 5");
list2.add("List 2 - Str 1");
list2.add("List 2 - Str 2");
list2.add("List 2 - Str 3");
list2.add("List 2 - Str 4");
list2.add("List 2 - Str 5");
}
public void onDtlTabChanged(TabChangeEvent event) {
System.out.println("000000000000000000");
}
public List<String> getList1() {
System.out.println("11111111111111");
return list1;
}
public List<String> getList2() {
System.out.println("222222222222222222");
return list2;
}
}
现在的问题是运行应用程序并尝试在选项卡之间导航(更改),但我可以看到在调用getter后调用“onDtlTabChanged”,这是一个很大的问题。
如果将tabView从静态更改为动态,那么行为是随机的,换句话说,调用change事件发生在getter中间的某个地方。
提前谢谢。
答案 0 :(得分:4)
我觉得它是一个主要的BUG,我找到了一个解决方法,如下所示
不要使用全局表单(tabView本身的表单)而是使用每个选项卡的表单(在数据表中围绕它)
您必须添加一个虚拟标签,作为第一个必须包含一些静态数据或预装数据的表单
多数,
问题是ajax请求在全局表单中,它导致数据表在ajax请求之前首先获取数据, Primefaces的奇怪之处在于,如果你不添加第一个虚拟标签,它将始终执行标签内的第一个表格并获取其数据,这将导致问题
问候,
答案 1 :(得分:2)
我认为阿里萨利赫的答案是正确的。
如果你遇到tabchangelistener的问题,也许这可以帮到你:
我在使用Primefaces 5.1时遇到了类似的问题
只要我将tabview放入表单中,一切正常。 但是因为我想在我的标签中使用单独的表单,我不得不删除tabview的周围形式以避免嵌套表单。 如果没有周围的形式,更改标签时不会再触发ajax事件。
我的解决方案是以与tabview平行的形式使用remotecommand remoteview由tabview元素的onTabChange属性触发。 在该调用中,我将index参数转发到全局请求参数。
<p:tabView id="rootTabMenu" styleClass="tabcontainer" prependId="false"
activeIndex="#{sessionData.activeTabIndex}" widgetVar="rootTabMenu"
onTabChange="tabChangeHelper([{name: 'activeIndex', value: index}])">
// Tabs...
</p:tabView>
<h:form id="tabChangeHelperForm">
<p:remoteCommand name="tabChangeHelper" actionListener="#{sessionData.onTabChange()}" />
</h:form>
在支持bean中,我从请求参数映射中再次捕获了值并设置了活动索引。
public void onTabChange()
{
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> paramMap = context.getExternalContext().getRequestParameterMap();
String paramIndex = paramMap.get("activeIndex");
setActiveTabIndex(Integer.valueOf(paramIndex));
System.out.println("Active index changed to " + activeTabIndex);
}
希望能帮到你
答案 2 :(得分:1)
它在Primefaces 3.5和mojarra 2.1.20中工作正常,我的代码: 豆:
@ManagedBean(name = "tabview")
@ViewScoped
public class TabView implements Serializable {
private static final long serialVersionUID = 1L;
private List<Car> l1;
private List<Car> l2;
private List<Car> l3;
public TabView() {
l1 = new ArrayList<Car>();
l2 = new ArrayList<Car>();
l3 = new ArrayList<Car>();
Car c1 = new Car("c1", "a1");
Car c2 = new Car("c21", "a21");
Car c3 = new Car("c31", "a31");
Car c4 = new Car("c41", "a41");
Car c5 = new Car("c51", "a51");
Car c6 = new Car("c61", "a61");
Car c7 = new Car("c71", "a71");
Car c8 = new Car("c81", "a81");
Car c9 = new Car("c91", "a91");
l1.add(c1);
l1.add(c2);
l1.add(c3);
l2.add(c4);
l2.add(c5);
l2.add(c6);
l3.add(c7);
l3.add(c8);
l3.add(c9);
}
public void hand(TabChangeEvent event) {
Car c1 = new Car("c1", "a1");
Car c2 = new Car("c1", "a1");
Car c3 = new Car("c1", "a1");
Car c4 = new Car("c1", "a1");
Car c5 = new Car("c1", "a1");
Car c6 = new Car("c1", "a1");
Car c7 = new Car("c1", "a1");
Car c8 = new Car("c1", "a1");
Car c9 = new Car("c1", "a1");
l1.add(c1);
l1.add(c2);
l1.add(c3);
l2.add(c4);
l2.add(c5);
l2.add(c6);
l3.add(c7);
l3.add(c8);
l3.add(c9);
}
public List<Car> getL1() {
return l1;
}
public void setL1(List<Car> l1) {
this.l1 = l1;
}
public List<Car> getL2() {
return l2;
}
public void setL2(List<Car> l2) {
this.l2 = l2;
}
public List<Car> getL3() {
return l3;
}
public void setL3(List<Car> l3) {
this.l3 = l3;
}
}
XHTML:
<p:tabView id="mtrlDtlTabs" dynamic="true" cache="false">
<p:ajax event="tabChange" update="t1 t2 t3" listener="#{tabview.hand}"/>
<p:tab id="t1" title="1">
<p:dataTable id="l1" value="#{tabview.l1}" var="l1">
<p:column headerText="l1">#{l1.manufacturer}</p:column>
<p:column headerText="l2">#{l1.model}</p:column>
</p:dataTable>
</p:tab>
<p:tab id="t2" title="2">
<p:dataTable id="l2" value="#{tabview.l2}" var="l2">
<p:column headerText="l2">#{l2.manufacturer}</p:column>
<p:column headerText="l22">#{l2.model}</p:column>
</p:dataTable>
</p:tab>
<p:tab id="t3" title="3">
<p:dataTable id="l3" value="#{tabview.l3}" var="l3">
<p:column headerText="l3">#{l3.manufacturer}</p:column>
<p:column headerText="l33">#{l3.model}</p:column>
</p:dataTable>
</p:tab>
</p:tabView>