复选框和单选按钮选择在h:selectOneMenu值更改时被清除

时间:2013-04-13 09:14:02

标签: jsf primefaces datatable selectonemenu valuechangelistener

我正在处理一个有两个数据表的表单。在第一个数据表中,我显示单选按钮和复选框,而第二个数据表包含 selectOneMenu用于(一个或多个)。值更改侦听器已在selectOneMenu上实现,并且在值更改时,后续字段将根据选择进行填充。 一切正常,但是当我从下拉列表中选择值时,复选框和单选按钮值将被清除。 f:ajax event =“change”已用于selectOneMenu上的change事件。看起来整个页面都会刷新并清除值。 我还尝试通过更新selectOneMenu所在的数据表的id来使用f:ajax。

        <p:dataTable styleClass="borderless" id="inResultTable" var="result" value="#{RequestBean.fooFields}" rendered="#{not empty RequestBean.fooFields}">
    <p:column style="width:150px;">
    <f:facet name="header">
    <h:outputText value=" " />
    </f:facet>
    <h:outputText value="#{msg[result.fldLabel]}" />
    </p:column>
    <p:column>
    <f:facet name="header">
    <h:outputText value="" />
    </f:facet>
    <ui:repeat value="#{RequestBean.fooFields}"
    var="itm">
    <h:selectOneMenu value="#{itm.indFieldValue}"
    rendered="#{result.lvlid==itm.lvlid}"
    style="width:250px;padding-right:150px;text-align: left;">
    <f:selectItems value="#{RequestBean[itm.indField]}" />
    </h:selectOneMenu>
    <h:selectOneRadio value="#{itm.indFieldValue}" rendered="#{result.lvlid==itm.lvlid and result.fldType=='radio'}"
    style="width:250px;padding-right:150px;text-align: left;">
    <f:selectItems value="#{RequestBean[itm.indField]}" />
    </h:selectOneRadio>
    <h:selectManyCheckbox value="#{itm.indFieldCheckBox}" rendered="#{result.lvlid==itm.lvlid and result.fldType=='selectbox'}">
    <f:selectItems value="#{RequestBean[itm.indField]}" />
    </h:selectManyCheckbox>
    </ui:repeat>
    </p:column>
    </p:dataTable>


    <p:dataTable styleClass="borderless"
    id="resultTable" var="result"
    value="#{RequestBean.depFields}">
    <h:selectOneMenu value="#{RequestBean.field4Value}"
    valueChangeListener="#{RequestBean.processValueChange4}"
    rendered="#{result.lvlid=='5' and result.fldType=='selectbox'}"
    style="width:250px;padding-right:150px;text-align: left;">
    <f:selectItem itemLabel="--Please Select--" itemValue="#{null}" />
    <f:selectItems value="#{RequestBean[result.field]}" />
    <f:ajax event="change" render="@form" />
    </h:selectOneMenu>
    ...
    ...

    </p:dataTable>

N.B:要求是带有复选框和单选按钮的数据表必须放在顶部。由于我是第二个表中的ID不能用于selectOneMenu 根据数据库中的条目动态填充selecOneMenu。 我知道这可能是一个简单的问题,但在大多数网站上发布的信息都没有运气。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是您的<f:ajax>

<f:ajax event="change" render="@form" />

您未指定process属性。因此它默认为@this,这意味着在提交期间仅处理当前输入组件。但是,您指定了整个表单的render。所以整个表格都会刷新。但是,在提交期间未处理其他输入组件。因此,他们的模型值不会更新,这意味着在渲染响应期间,将重新显示初始值而不是提交的值,在您的情况下显然为空/空。

你基本上有两种选择:

  1. 在提交期间处理整个表单。

    <f:ajax process="@form" render="@form" />
    
  2. 或者,只更新那些真正需要更新的组件。

    <f:ajax render="clientId1 clientId2 clientId3" />
    
  3. 您的特定情况中,我认为选项2不可行,因此选项1是最好的选项。请注意,我省略了event属性。它默认为change


    对具体问题

    无关,我不确定你在改变价值观的方法中做了什么,但我只想注意大多数初学者为了操纵而滥用它模型值并且它并不总是按预期工作(改变的模型值根本没有反映)。如果在您的情况下这是真的,那么您实际上应该使用<f:ajax listener>代替。

    另见:

答案 1 :(得分:0)

Check box&amp;值的主要原因。在值更改侦听器后,单选按钮被清除可能是模型值未更新。

在更新模型之前调用值更改侦听器。

对于这些问题,了解JSF生命周期非常重要。

请尝试在值更改侦听器中使用以下代码,然后查看。

public void valueChange(ValueChangeEvent event){

    PhaseId phase = event.getPhaseId();
    if (phase.equals(PhaseId.ANY_PHASE))
    {
        event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
        event.queue();
        return;
    }
    if(!phase.equals(PhaseId.UPDATE_MODEL_VALUES))
    {
        return;
    }
    // Your code
}

我没有尝试使用您的示例代码。如果它不起作用,请通过完整的示例源代码告诉我。

感谢。