Active Index未自动更新。通过将tabView放在可以使用的表单上来回顾一些帖子。或者通过在tabview中包含<p:ajax event="tabChange"/>
,它可以正常工作。但似乎没有任何效果
XHTML
示例1:自动更新
<p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" activeIndex="#{promotionDetailBean.activeTabIndex}">
<p:tab id="categoriesTab" title="#{promoArticle.categoryName}">
<p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex">
<p:column id="select" selectionMode="multiple" />
<p:column id="barCode">
<h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}"
styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
示例2:更新tabChange事件
<h:form id="form">
<p:growl id="growlm" showDetail="true" />
<p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" >
<p:ajax event="tabChange" listener="#{promotionDetailBean.tabChanged}" update=":growlm" />
<p:tab id="categoriesTab" title="#{promoArticle.categoryName}">
<p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex">
<p:column id="select" selectionMode="multiple" />
<p:column id="barCode">
<h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}"
styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
我需要识别&#34; onChange&#34;事件。但activeIndex始终为0,即初始化值。该活动无法接听电话。
豆
private Integer activeTabIndex = 0;
public Integer getActiveTabIndex() {
return activeTabIndex;
}
public void setActiveTabIndex(Integer activeTabIndex) {
this.activeTabIndex = activeTabIndex;
}
豆
public void tabChanged(TabChangeEvent event){
TabView tv = (TabView) event.getComponent();
this.activeTabIndex = tv.getActiveIndex();
}
但事件并没有得到解决。也不会自动更新。
可能的问题是什么?
谢谢, Shikha
答案 0 :(得分:13)
当tab不包含在表单中但每个选项卡都包含自己的选项卡时,这对我有用:
将标签更改事件的监听器添加到tabView组件:
<p:ajax event="tabChange" listener="#{userBean.onTabChange}" />
从基础TabView组件获取活动索引似乎不起作用。但是,在这种情况下,新选择的选项卡会正确更新,因此我们可以通过搜索TabView的子组件来获取索引:
public void onTabChange(TabChangeEvent event) { TabView tabView = (TabView) event.getComponent(); activeTab = tabView.getChildren().indexOf(event.getTab()); }
我希望这也适合你
答案 1 :(得分:5)
以下对我有用:
XHTML:
<p:tabView id="categoryTabView" var="promoArticle"
value="#{promotionDetailManagedBean.articuloPromocionDTOs}" dynamic="true">
<p:ajax event="tabChange" listener="#{promotionDetailManagedBean.onTabChange}" />
<p:tab> ... </p:tab>
</p:tabView>
豆:
public final void onTabChange(final TabChangeEvent event) {
TabView tv = (TabView) event.getComponent();
this.activeTabIndex = tv.getActiveIndex();
}
答案 2 :(得分:4)
对于primefaces&gt; = 5.0 请使用以下代码:
public final void onTabChange(TabChangeEvent event) {
TabView tv = (TabView) event.getComponent();
this.ActiveIndex = tv.getChildren().indexOf(event.getTab());
}
答案 3 :(得分:2)
只有active index is not binded to the managed bean似乎才有效。但这对我来说没用,因为我想保持支持bean-view同步。我很惊讶 Primefaces 团队还没有解决它(我正在使用3.5版本)。但是,如果p:tabView
本身包含在h:form
中而不是每个标签中都包含其中一个,那么它可以正常工作,但这会让您更改提交上下文。
答案 4 :(得分:0)
<p:column id="barCode">
<h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}"
styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',
#{promotionDetailBean.activeTabIndex},
'promotionDetail_dataTable',#{rowIndex},
'originalCostInputTxt')" /> **_____/>_____**
</p:column>
立即为true可能会导致p:ajax出现问题,当您没有验证或尝试取消操作时,应立即使用true。
public void tabChange(TabChangeEvent event){
TabView tabView = (TabView) event.getComponent();
Tab tab = (Tab) event.getTab();
String tabChangedMessage = tab.getTitle() + " changed. index=" + tabView.getActiveIndex();
System.out.println(tabChangedMessage);
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage("Tab changed", tabChangedMessage));
}
<p:tabView>
<p:ajax event="tabChange" listener="#{tabChangeBean.tabChange}" update=":growlId" />
<p:tab title="tab 1">
tab1 inside
</p:tab>
<p:tab title="tab 2">
tab1 inside
</p:tab>
</p:tabView>
这有效但活动索引为0.
答案 5 :(得分:0)
在您的xhtml中,您正在调用listener =“#{promotionDetailBean。 onTabChange }”,但在您的bean中,方法名称为“public void tabChanged ”。所以它无法触发。
我在Prime-showcase上尝试了一个例子:
bean中的(TabBean):
private Integer activeTabIndex = 1;
// setter/getter
public void onTabChange(TabChangeEvent event) {
FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab().getTitle());
TabView tabView = (TabView) event.getComponent();
int activeTabIndex = tabView.getActiveIndex();
System.out.println("--------" + activeTabIndex);
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> params = context.getExternalContext().getRequestParameterMap();
String activeIndexValue = params.get(tabView.getClientId(context) + "_activeIndex");
System.out.println("--------" + activeIndexValue);
context.addMessage(null, msg);
}
xhtml中的(tabviewChangeListener.xhtml):
<p:tabView id="tabView" dynamic="true" activeIndex="#{tabBean.activeTabIndex}">
<p:ajax event="tabChange" listener="#{tabBean.onTabChange}" update=":form:growl"/>
<p:tab title="Godfather Part I" id="Godfather1">
结果符合预期: 开始时,将显示第二个选项卡。我点击第一个标签,然后点击第三个sysout是:
-------- 0
-------- 0
-------- 2
-------- 2
答案 6 :(得分:0)
我很容易解决这个问题:
public void onSPTabChange(TabChangeEvent event)
{
TabView tabView = (TabView) event.getComponent();
currentData.setSP_Index(tabView.getChildren().indexOf(event.getTab())+1);
}
在currentdata中我有属性SP_Index,其中包含tab的数量(第一,第二......)
<p:tabView id="tabView" styleClass="tabView">
<p:ajax event="tabChange" listener="#{dataAccess.onSPTabChange}" />
....
并添加jquery脚本
<script>
$("#tabView li:nth-child(#{currentData.SP_Index})").click();
</script>
答案 7 :(得分:-1)
public final void onTabChange(final TabChangeEvent event) {
TabView tv = (TabView) event.getComponent();
this.activeTabIndex = tv.getIndex();
}
这对我有用......