Primefaces p:tabView:selectOneMenu的值丢失
Posted
技术标签:
【中文标题】Primefaces p:tabView:selectOneMenu的值丢失【英文标题】:Primefaces p:tabView: Value of selectOneMenu lost 【发布时间】:2014-11-27 06:12:04 【问题描述】:当我使用带有 dynamic="true" 的 p:tabView 时遇到问题,并且在一个选项卡上有一个 h:selectOneMenu,而在另一个选项卡上是一个 commandLink,它是 ajax="false"。单击 commandLink 两次后,selectOneMenu 的值会丢失。
tabView为dynamic="false"时不会出现此问题。
h:inputText 的值没有丢失,但我在日志文件中看到以下警告:
org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput WARNING: There should always be a submitted value for an input if it is rendered, its form issubmitted, and it was not originally rendered disabled or read-only. You cannot submit a form after disabling an input element via javascript. Consider setting read-only to true instead or resetting the disabled value back to false prior to form submission. Component : Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /form/regional/region.xhtml][Class: javax.faces.component.html.HtmlBody,Id: j_id_5][Class: javax.faces.component.html.HtmlForm,Id: TestForm][Class: org.primefaces.component.tabview.TabView,Id: tabviewTest][Class: org.primefaces.component.tabview.Tab,Id: j_id_8][Class: javax.faces.component.html.HtmlInputText,Id: j_id_f]
这是表格:
<p:tabView dynamic="true" cache="true" id="tabviewTest">
<p:tab title="Tab 1">
<h:selectOneMenu value="#Region.dropDownValue" id="dropDown">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItem itemLabel="1" itemValue="1"/>
<f:selectItem itemLabel="2" itemValue="2"/>
<f:selectItem itemLabel="3" itemValue="3"/>
<f:selectItem itemLabel="4" itemValue="4"/>
</h:selectOneMenu>
<h:inputText value="#Region.inputValue" />
</p:tab>
<p:tab title="Tab 2">
<p:commandLink ajax="false"
id="link"
value="Test"
actionListener="#Region.someActionMethod" />
</p:tab>
</p:tabView>
这里是 Bean:
public class Region
private Integer dropDownValue = 3;
private String inputValue = "Test";
public void someActionMethod(ActionEvent ev)
System.out.println("someActionMethod called");
public Integer getDropDownValue()
return dropDownValue;
public void setDropDownValue(Integer dropDownValue)
this.dropDownValue = dropDownValue;
public String getInputValue()
return inputValue;
public void setInputValue(String inputValue)
this.inputValue = inputValue;
我的环境:Primefaces 5.0/5.1.RC1、Myfaces 2.1/2.2、Tomact 7
有什么想法可能是错的吗?
【问题讨论】:
“价值丢失”是什么意思?您的意思是该值已重置为默认值?还是空白? 看,cache="true"
和 dynamic="true"
在 IMO 上有些矛盾。设置cache="true"
再试一次
对不起,我的意思是设置cache="false"
它不适用于cache="false"
- 我已经尝试过了。
你已经有了答案。为什么你不能有dynamic="false"
?
【参考方案1】:
您的 ManagedBean 有什么范围?
当您使用 RequestScope 时,当您将 ajax 属性设置为 false 时,您无法使用诸如 p:commandLink 之类的 UICommand 组件提交您的 selectOneMenu。在这种情况下,更改会丢失。
这里有两种方法可以解决您的问题:
尝试 1:设置 Bean ViewScoped: 在大多数情况下,这将起作用。如果您必须使用特殊注解来注解您的 bean(例如 Apache DeltaSpike @ViewAccessScoped),请尝试将您的 bean 分离为 View 和 Controller bean,仅使用简单的 @ViewScope 对 View 进行注解并保留其中的所有值。
尝试 2:从 p:commandLink 中删除 ajax="false": 如果您的用例允许,这将起作用。例如,使用 PrimeFaces 下载文件将需要明确声明不使用 ajax,因此此解决方案将不适用。
【讨论】:
关于 1:ManageBean 是会话范围的,所以这不是原因。 关于2:我发布的代码被简化了,在实际应用中我有一些触发全页提交的组件(因此无法使用Ajax) 嗯好的。对我来说,如果我使用其中一种尝试,您的示例效果很好。可能您的问题的原因来自您的 inputField 的警告。我认为 selectMenu 的值丢失并且 inputField 的值在它们都处于相同形式时保持不变也是不正常的行为。您是否尝试过使用 PhaseListener 调试您的应用程序?【参考方案2】:添加 ajax 监听器
<h:selectOneMenu value="#Region.dropDownValue" id="dropDown">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItem itemLabel="1" itemValue="1"/>
<f:selectItem itemLabel="2" itemValue="2"/>
<f:selectItem itemLabel="3" itemValue="3"/>
<f:selectItem itemLabel="4" itemValue="4"/>
<p:ajax event="change" update="@this"/>
</h:selectOneMenu>
【讨论】:
以上是关于Primefaces p:tabView:selectOneMenu的值丢失的主要内容,如果未能解决你的问题,请参考以下文章