Primefaces选项卡ajax部分更新错误
Posted
技术标签:
【中文标题】Primefaces选项卡ajax部分更新错误【英文标题】:Primefaces tab ajax partial update bug 【发布时间】:2013-03-12 04:39:21 【问题描述】:我相信在尝试使用 ajax 对其进行部分更新时,primefaces 中存在错误。我在 primefaces 论坛上发布了相同的查询,但没有任何人回复。
我附上了一个示例,其中我有一个带有两个选项卡的 tabView。当我单击“加载新选项卡内容”按钮时,它会调用我的支持 bean 来动态更改 tab1 的内容。它应该清除 tab1 的现有内容并加载新内容,在这种情况下它只是一个 inputText。然后我使用 RequestContext.getCurrentInstance().update(updateIds) 方法来指示我希望 tab1 自行刷新。问题是标签标题没有改变,新的 inputText 内容放在 tab1 和 tab2 中,但我从未指定对 tab2 做任何事情,所以不明白为什么还有一个新的 inputText。您可以使用此代码并尝试自己查看是否得到相同的结果,或者如果我做错了什么,请纠正我。
Primefaces 3.5 Mojarra JSF API (javax.faces/2.1) 2.1.15 (20121116-1711) Mojarra JSF 实现 (javax.faces/2.1) 2.1.15 (20121116-1711) Tomcat 7.0.32 JDK 1.6.0_07**
dynamicTabLoading.xhtml
**
<?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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui" >
<h:head>
<title>Prime Prototype Dynamic Tabs</title>
</h:head>
<h:body>
<h:form id="myForm">
<p:panel>
<h:outputText value="Dynamic Tab Loading..."></h:outputText>
<p:commandButton id="loadTabContentBtn" value="Load New Tab Content"
actionListener="#tabManager.loadNewTabContent" />
<p:tabView id="tabView1" binding="#tabManager.tabViewComponent" dynamic="true" >
<p:tab id="tab1" title="Tab 1" closable="true" >
<h:outputText value="blank 1" />
</p:tab>
<p:tab id="tab2" title="Tab 2" closable="true" >
<h:outputText value="blank 2" />
</p:tab>
</p:tabView>
</p:panel>
</h:form>
<!-- TODO remove for production -->
<ui:debug />
</h:body>
</html>
**
TabManager.java
**
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.component.UIComponent;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.tabview.Tab;
import org.primefaces.component.tabview.TabView;
import org.primefaces.context.RequestContext;
@ManagedBean
public class TabManager
private TabView tabViewComponent;
public void loadNewTabContent()
/* get list of tabs from tabView*/
List<UIComponent> tabs = getTabViewComponent().getChildren();
/* get the first tab which had id="tab1" */
Tab targetTab = (Tab)tabs.get(0);
System.out.println("Target Tab Id is " + targetTab.getClientId());
/* clear the tabs current content */
targetTab.getChildren().clear();
/* set new tab title and new content */
targetTab.setTitle("Tab 1 Changed");
InputText inputTxt = new InputText();
inputTxt.setValue("This is new content for Tab 1 ");
targetTab.getChildren().add(inputTxt);
List<String> updateIds = new ArrayList<String>();
updateIds.add(targetTab.getClientId());
RequestContext.getCurrentInstance().update(updateIds);
public TabView getTabViewComponent()
return tabViewComponent;
public void setTabViewComponent(TabView tabViewComponent)
this.tabViewComponent = tabViewComponent;
谢谢
【问题讨论】:
几年前我从 IceFaces (JSF 1.2) 迁移到 Primefaces。那时我非常依赖绑定来更新组件,甚至生成页面内容,这很糟糕。自从搬到 Primefaces 之后,我甚至一次都不需要使用绑定。而且我经常使用标签。也许与其给出一段抽象的(但可重现的)代码,不如告诉我们你到底想要做什么。也许有更好的方法来实现这一点。 【参考方案1】:当 tabview 被加载时,它会将内容放入缓存中。因此,当您要重新加载内容时,它不会刷新内容。尝试在 tabview 属性中使用 dynamic="true" 和 cache="false" 来解决相同的问题。
【讨论】:
以上是关于Primefaces选项卡ajax部分更新错误的主要内容,如果未能解决你的问题,请参考以下文章
Primefaces AJAX update =“@ form”两次调用监听器
Primefaces p:tabView:selectOneMenu的值丢失