Jsf Primefaces p:tabView:selectOneMenu的值丢失
当我使用带有dynamic=“true”的p:tabView时,我遇到了一个问题,在一个选项卡上有一个h:selectOneMenu,而在另一个选项卡上有一个commandLink,它是ajax=“false”。单击命令链接两次后,selectOneMenu的值将丢失 当选项卡视图为dynamic=“false”时,不会出现此问题 h:inputText的值没有丢失,但我在日志文件中看到以下警告:Jsf Primefaces p:tabView:selectOneMenu的值丢失,jsf,jsf-2,primefaces,myfaces,Jsf,Jsf 2,Primefaces,Myfaces,当我使用带有dynamic=“true”的p:tabView时,我遇到了一个问题,在一个选项卡上有一个h:selectOneMenu,而在另一个选项卡上有一个commandLink,它是ajax=“false”。单击命令链接两次后,selectOneMenu的值将丢失 当选项卡视图为dynamic=“false”时,不会出现此问题 h:inputText的值没有丢失,但我在日志文件中看到以下警告: org.apache.myfaces.shared.renderkit.html.HtmlRend
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]}
表格如下:
我的环境:Primefaces 5.0/5.1.RC1、Myfaces 2.1/2.2、Tomact 7
有什么想法吗?您的ManagedBean有什么范围 使用RequestScope时,如果将ajax属性设置为false,则无法提交带有UICommand组件(如p:commandLink)的selectOneMenu。在这种情况下,更改将丢失 以下是解决问题的两种可能性: 尝试1:设置Bean的可视范围: 在大多数情况下,这将起作用。如果必须使用特殊的注释来注释bean(例如apachedeltaspike@viewaccessscope),请尝试将bean分为视图bean和控制器bean,仅使用simple@ViewScope注释视图并保留其中的所有值 尝试2:从p:commandLink: 如果您的用例允许,这将起作用。例如,下载带有PrimeFaces的文件需要明确声明不使用ajax,因此此解决方案将不适用。添加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>
关于1:ManageBean是会话范围的,所以这不是原因。关于2:我发布的代码是简化的,在实际应用中,我有一些组件可以触发整页提交(因此不可能使用Ajax)。对我来说,如果我使用其中一种尝试,你的例子效果很好。问题的原因很可能来自输入字段的警告。我认为selectMenu的值丢失,inputField的值保持不变,这也不是一种正常的行为。您是否尝试过使用PhaseListener调试应用程序?您所说的“值丢失”是什么意思?您的意思是该值重置为默认值吗?或者它是空的?看,cache=“true”
和dynamic=“true”
在我看来有些矛盾。设置cache=“true”
然后再试一次。我的意思是设置cache=“false”
它与cache=“false”
不起作用-我已经试过了。你已经有了答案。为什么不能使用dynamic=“false”
?
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;
}
}
<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>