在 ajax 调用期间,<h:selectOneMenu>inside <ui:repeat> 的空值未设置为支持 bean


在 ajax 调用期间,h:selectOneMenu 的空/空值未设置为后备 Bean 中的属性,

而如果我选择任何具有非空/非空值的下拉项,则在 ajax 调用期间将其设置为后备 Bean 中的属性。只有当我在 ui:repeat 标签中使用 h:selectOneMenu 和 f:ajax 时,我才会注意到这种行为。并且,如果没有 ui:repeat 标记,则在 ajax 调用期间,值(空和非空)将正确设置为后备 Bean 中的属性。

以下是上述场景的代码狙击:

<h:panelGrid id="details">
<ui:repeat id="listId" value="#{new.List}" var="item" varStatus="itemStatus">
    <h:panelGrid id="idDoc">
    <ui:repeat id="docListId" value="#{item.docs}" var="docItem" varStatus="docStatus">
        <h:selectOneMenu id="type"  value="#{docItem.docType}" label="Type" style="" styleClass='' >
                <f:selectItems value="#{new.docSelections}"/>
                <f:ajax onevent="refreshDoc" event="valueChange" render="@this :form:listId:docListId:idDoc" execute=":form:listId:details" listener="#{new.save}"/>
            </h:selectOneMenu>
    </ui:repeat>
    </h:panelGrid>
</ui:repeat>
</h:panelGrid>

我使用 ui:repeat,h:selectoneMenu 和 f:ajax 的方式有问题吗?

你似乎在使用Mojarra。它确实有几个与(嵌套)<ui:repeat>和组件状态保存相关的问题。尝试将莫哈拉升级到最新版本。

另一种方法是将<h:panelGrid><ui:repeat>替换为<h:dataTable>,因为它有效地生成相同的标记。<h:dataTable>不受<ui:repeat>问题的影响。

<h:dataTable id="details" value="#{new.List}" var="item" binding="#{itemStatus}">
  <h:column>
    <h:dataTable id="idDoc" value="#{item.docs}" var="docItem" binding="#{docStatus}">
      <h:column>
        <h:selectOneMenu id="type"  value="#{docItem.docType}" label="Type" style="" styleClass='' >
          <f:selectItems value="#{new.docSelections}"/>
          <f:ajax onevent="refreshDoc" event="valueChange" render="@this :form:listId:docListId:idDoc" execute=":form:listId:details" listener="#{new.save}"/>
        </h:selectOneMenu>
      </h:column>
    </h:dataTable>
  </h:column>
</h:dataTable>

相关内容

  • 没有找到相关文章

最新更新