我正在使用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事件的更新目标没有得到刷新。
请提供建议/解决方案。
答案 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");
}