当我使用带有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
任何想法可能出错?
答案 0 :(得分:1)
您的ManagedBean有什么范围?
当您使用RequestScope时,如果将ajax属性设置为false,则无法使用p:commandLink等UICommand组件提交selectOneMenu。在这种情况下,更改将丢失。
以下是解决问题的两种方法:
尝试1:设置Bean ViewScoped: 在大多数情况下,这将起作用。如果必须使用特殊注释来注释bean(例如Apache DeltaSpike @ViewAccessScoped),请尝试将bean分离为View和Controller bean,只需使用简单的@ViewScope注释View并保留其中的所有值。
尝试2:删除ajax =&#34; false&#34;来自p:commandLink: 如果您的用例允许,这将有效。例如,使用PrimeFaces下载文件将需要明确声明不使用ajax,因此该解决方案将不适用。
答案 1 :(得分:0)
添加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>