我使用Primefaces 3.5 JSF2.1一个项目工作(钻嘴鱼科)
我已经创建了一个primefaces(P:TabView的ID =“tabsVw”动态=“假”>)与内部的两个选项卡,每个选项卡具有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>
和豆内部(图作用域)
@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;
}
}
现在的问题是运行应用程序并尝试选项卡之间进行切换(改变)时,但我可以看到“onDtlTabChanged”呼唤干将之后调用,所以这是一个大问题。
如果改变从静态到动态的TabView的,则该行为是随机的,换句话说,调用的变化事件在吸气的中间的某个地方发生。
先感谢您。
嗯,我认为它是一个primefaces BUG,我发现了一个解决方法,其为以下
不要使用一个全球性的表单(form为TabView的本身),而不是使用表单每个选项卡(里面环绕数据表)
你必须添加一个虚拟标签是第一个必须包含一种形式,一些静态的数据或预加载内部的数据
就这样,
问题是,AJAX请求是全球表格内,它会导致数据表,以AJAX请求之前先得到他们的数据,与Primefaces奇怪的是,如果你不添加第一伪标签,它会永远执行里面的第一种形式标签和获得它的数据,这将导致一个问题
问候 ,
我觉得阿里·萨利赫的答案是正确的。
如果你得到的tabchangelistener问题或许这可以帮助你:
我有一个类似的问题与Primefaces 5.1
只要我把TabView的进入形式,一切运行良好。 但是,因为我想在我的标签使用单独的形式,我不得不删除了TabView的周围的形式,以避免嵌套形式。 如果没有周围的形式改变标签当AJAX事件仍然不会触发任何更多。
我的解决办法是在平行于TabView的形式使用remotecommand。
该remotecommand由TabView的元素的onTabChange属性触发。 在该呼叫我转发的指标参数的全局请求参数。
<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 i。从请求参数映射再次钓到的值,并设置活动指数。
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);
}
希望能帮助你
它在Primefaces 3.5和钻嘴鱼科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>