Primefaces p:tabView:selectOneMenu的值丢失

时间:2014-10-02 09:11:50

标签: jsf jsf-2 primefaces myfaces

当我使用带有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

任何想法可能出错?

2 个答案:

答案 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>