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的值丢失的主要内容,如果未能解决你的问题,请参考以下文章

在tabview中的scrollpanel上的PrimeFaces按钮

Primefaces tabview 验证与动态选项卡

JSF Primefaces TabView 问题

Primefaces tabview 设置默认静态选项卡

Primefaces TabView 动态

动态 TabView primefaces,选项卡渲染属性不起作用