1

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

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

4

2 回答 2

1

这是你的<f:ajax>

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

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

你基本上有两个选择:

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

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

     <f:ajax render="clientId1 clientId2 clientId3" />
    

您的特定情况下,我认为选项 2 不可行,因此选项 1 是最好的选项。请注意,我省略了该event属性。它默认为change已经。


与具体问题无关,我不确定您在值更改侦听器方法中都在做什么,但我只想指出,大多数初学者滥用它来操纵模型值并且它并不总是完全按预期工作(根本没有反映更改的模型值)。如果您的情况是这样,那么您实际上应该使用它<f:ajax listener>

也可以看看:

于 2013-04-14T01:44:13.717 回答
0

在值更改侦听器后清除复选框和单选按钮的值的主要原因可能是模型值未更新。

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

对于这类问题,了解 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
}

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

谢谢。

于 2013-04-13T19:51:59.400 回答