selectOneMenu在可编辑的dataTable中没有刷新

时间:2017-02-20 06:31:30

标签: ajax jsf primefaces jsf-2

我正在使用JSF 2.0和Primefaces 5.2。

我的xhtml页面中有一个可编辑的dataTable,它有一个selectOneMenu。在rowSelect上,我希望selectOneMenu填充值。以下是我的xhtml页面的代码片段 -

    <h:form id="form_defineCustomerEffort">

            ...

            <p:dataTable id="addCustEffortSummTable" var="custeffsumvar" dynamic="true" editable="true"
                value="#{oumOpportunityBean.customEffortEntities}" rowIndexVar="rowIndex" 
                selection="#{oumOpportunityBean.selectedCustomEffortForSC}"
                selectionMode="single" scrollWidth="1190" 
                rowKey="#{custeffsumvar.id}" paginator="true"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                paginatorAlwaysVisible="false" rowsPerPageTemplate="5,10,15,20,30,50">

                <p:ajax event="rowEdit"
                    listener="#{oumOpportunityBean.onRowEditCustomEffort}"
                    update=":form_defineCustomerEffort:msgs" />
                <p:ajax event="rowEditCancel"
                    listener="#{oumOpportunityBean.onRowCancel}"
                    update=":form_defineCustomerEffort:msgs" />
                <p:ajax event="rowSelect"
                    listener="#{oumOpportunityBean.setSCStaffProfile}" 
                    update=":form_defineCustomerEffort:addCustEffortSummTable:sc_StaffProfileMenuSumm"          
                     />

                <f:facet name="header">Custom Effort</f:facet>

                <p:column>
                    <f:facet name="header"
                        style="width: 500px;white-space: -moz-pre-wrap !important;white-space: -pre-wrap;white-space: -o-pre-wrap;white-space: pre-wrap;word-break: break-all;white-space: normal;">
                        <h:outputText value="#"></h:outputText>
                    </f:facet>
                    <h:outputText value="#{rowIndex+1}" />
                </p:column>

                ...

                <p:column headerText="Staffing Profile Assignment">
                    <p:cellEditor>
                        <f:facet name="output"
                            style="width: 500px;white-space: -moz-pre-wrap !important;white-space: -pre-wrap;white-space: -o-pre-wrap;white-space: pre-wrap;word-break: break-all;white-space: normal;">
                            <h:outputText
                                value="#{custeffsumvar.oumStaffProfileForWbsCustEffort.profileName}" />
                        </f:facet>
                        <f:facet name="input"
                            style="width: 500px;white-space: -moz-pre-wrap !important;white-space: -pre-wrap;white-space: -o-pre-wrap;white-space: pre-wrap;word-break: break-all;white-space: normal;">
                            <p:selectOneMenu id="sc_StaffProfileMenuSumm" required="true"
                                requiredMessage="Please select a Staff Profile."
                                title="Please select a Staff Profile."
                                converter="assetStaffProfileConverter"
                                value="#{custeffsumvar.oumStaffProfileForWbsCustEffort}">
                                <f:selectItem itemLabel="Select Staff Profile" itemValue="" />
                                <f:selectItems id="sc_StaffProfileSelectitemsSumm"
                                    value="#{oumOpportunityBean.profileList}" var="scProfile"
                                    itemLabel="#{scProfile.profileName}" itemValue="#{scProfile}" />
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>
                </p:column>

                ...

                <p:column>
                    <p:rowEditor />
                </p:column>

                ...

现在,通过调试,我可以看到在行选择上调用了oumOpportunityBean.setSCStaffProfile(),并且oumOpportunityBean.profileList列表中填充了值,但是“sc_StaffProfileMenuSumm”中没有反映出来selectOneMenu用于

因此,看起来rowSelect ajax事件的更新目标没有得到刷新。

请提供建议/解决方案。

1 个答案:

答案 0 :(得分:1)

<强>解释

问题是更新声明。作为更新目标,您定义“:form_defineCustomerEffort:addCustEffortSummTable:sc_StaffProfileMenuSumm”,它不存在。

下拉菜单的ID已编号,因为您在p:dataTable中定义了它。所以你的下降有这样的ID:

form_defineCustomerEffort:addCustEffortSummTable:0:sc_StaffProfileMenuSumm
form_defineCustomerEffort:addCustEffortSummTable:1:sc_StaffProfileMenuSumm

等等(看一下渲染的html)。

要更新当前行,最好这样做:

update="@row(rowIndex)"

但这不起作用。对于数据表,Ajax-Behavior被定义一次,而更新部分仅被评估一次。此时没有设置rowIndex,这就是你得到异常的原因。

<强>解决方案

所以在我看来,最好的选择是将rowIndex作为参数传递给你的侦听器方法:

listener="#{oumOpportunityBean.setSCStaffProfile(rowIndex)}" 

并在后端更新正确的组件(您可以从p:ajax中删除更新属性):

public void setSCStaffProfile(int rowIndex) {
   // populate list
   // ...

   // update the right component
   RequestContext.getCurrentInstance().update("form_defineCustomerEffort:addCustEffortSummTable:" + rowIndex + ":sc_StaffProfileMenuSumm");
}