【发布时间】:2014-10-14 13:41:05
【问题描述】:
我在使用 primefaces 5.0 和 jsf 2.2.5 时遇到问题。用一个
p:tabView 有两个选项卡共享同一个 ManagedBean 和同一个对象,事件 tabChange 没有按预期工作。当用户更改选项卡时,我想执行与单击按钮相同的验证,但事件并未刷新 bean 值,而是发布了值。我能够用这个简单的例子重现这个问题。
xhtml代码:
<h:body>
<div class="well">
<h:form id="testeForm">
<p:tabView id="tView">
<p:ajax event="tabChange"
process="@this"
update="@form"
listener="#{testeBean.onTabChange}" />
<p:tab id="tab1" title="tab1">
<p:inputText id="teste1"
value="#{testeBean.evento.nome}" />
<p:commandButton id="savetab1"
process="tab1"
update="@form"
actionListener="#{testeBean.saveTab1}"
value="salvarTab1">
</p:commandButton>
</p:tab>
<p:tab id="tab2" title="tab2">
<p:inputText id="teste2"
value="#{testeBean.evento.descricao}" />
<p:commandButton id="savetab2"
process="tab2"
update="@form"
actionListener="#{testeBean.saveTab2}"
value="salvarTab2">
</p:commandButton>
</p:tab>
</p:tabView>
</h:form>
</div>
</h:body>
托管豆:
package com.example.bean;
@ViewScoped
@ManagedBean(name = "testeBean")
@Getter
@Setter
public class TesteBean {
private Evento evento;
@PostConstruct
public void init() {
evento = new Evento();
}
public void saveTab1() {
System.out.println(evento);
}
public void saveTab2() {
System.out.println(evento);
}
public void onTabChange(TabChangeEvent evt) throws LoundScreenException {
System.out.println(evt.getTab().getId());
System.out.println(evento);
}
}
发布的价值:
我试过 process="@this" process="@form" process="@all" immediate="true" 没有成功。我在这里错过了什么吗?
提前致谢。
重要更新:
在花了一些时间调试 primefaces 代码后,在 org.primefaces.component.api.UITabPanel 类中,我意识到 Primefaces 仅在其 process() 方法中处理子组件,如果它不是 ajax 请求的来源:
if(isRequestSource(context)) {
return;
}
所以我删除了这段代码并重新编译了 primefaces,现在它可以正常工作了。我会公开这个问题,以防万一比我更有经验的人找到更好的解决方案。
【问题讨论】:
标签: jsf jsf-2 primefaces