p:selectOneMenu首先是ajax请求问题

时间:2012-07-24 12:10:34

标签: jsf-2 primefaces

当我尝试通过更改SelectOneMenu的值来更新p:dataGrid时,我遇到了PrimeFaces p:selectOneMenu组件的问题。

XHTML:可

<p:selectOneMenu value="#{bussinessOwnersViewerMB.selectedCity}" effect="explode">
  <f:selectItems value="#{bussinessOwnersViewerMB.cities}" var="city" itemLabel="#{city.cityName}" itemValue="#{city.cityId}"/>  
  <p:ajax listener="#{bussinessOwnersViewerMB.handleCityChange}" update="mainform:bolist"/>
</p:selectOneMenu>

<p:dataGrid id="bolist" var="bo" value="#{bussinessOwnersViewerMB.bOwners}" columns="3" rows="#{bussinessOwnersViewerMB.os}">
  <p:column>
    <p:panel header="#{bo.bOName}">
      <h:panelGrid columns="1">
        <p:graphicImage value="/resources/images/#{bo.boType}/#{bo.bOId}/mainProfile.jpg"/>
      </h:panelGrid>
    </p:panel>
  </p:column>
</p:dataGrid>

问题是,当我第一次更改selectOneMenu的值时,datagrid没有得到更新。发生的事情只是调用postconstructor方法,在第一次更改之后它才能正常工作。

我的托管bean是一个视图编辑的托管bean。

监听器方法“bussinessOwnersViewerMB.handleCityChange”是:

public void handleCityChange(ValueChangeEvent event) {  
  bOwners = bovb.loadAllDistributerByType(new Integer(selectedCity)); // selectedcity is the selected item id 
  os = Integer.toString(bOwners.size());
}

2 个答案:

答案 0 :(得分:0)

过去你无法更新像这样的dataGrid;你必须将它包装在panelGroup中。我不知道有没有改变,但我仍然这样做,它仍然有效。所以只需将dataGrid放在panelGroup中并更新ajax标记中的panelGroup(而不是dataGrid)。

答案 1 :(得分:0)

在我的情况下,问题是由包含<p:panel>的{​​{1}}产生的,因此使用<h:panelGroup>进行的部分提交不起作用。当表单中的空白字段为<p:ajax>时,就会发生此问题。

我更新了required=true中的<p:panel>

发件人:

<h:panelGroup>

<p:panel ... >
    ...
    <h:panelGroup ...>
        <!-- Form inside -->
    </h:panelGroup>
    ...
</p:panel>