EDIT:在视图构造时尝试填充集合后,一切都工作了,在该视图的支持bean类的@ postconstruct init()方法中。它是@ viewscope。因此,问题在于组件不知何故不能识别用作数据表值的集合,实际上具有值,因为它以一种不常见的方式填充。无论如何,如果我在视图构建时填充集合,一切都可以完美地工作。但这当然不是一个解决方案,因为集合必须在提到的模糊ajax事件上填充。所以这是某种生命周期/作用域问题。
EDIT2:我试图将表添加到与其中具有ajax模糊效果的组件相同的表单中,显示弹出框和该弹出框中的数据表并填充集合。这也奏效了。因此,ajax模糊事件和数据表功能的生命周期/范围是不同的,因为它们的形式不同。现在我应该设法保持他们在同一范围内,而在弹出对话框中的数据表。现在,出于上述测试目的,数据表笨拙地驻留在相同的形式中。
我在p:confirmDialog
中有一个Primefaces p:dataTable
,当我选择一个项目时,该项目的setter只获得null
值。因此,设置了null
值,下面的操作显然不起作用,因为我们没有值可以使用。
我认为这个问题与我必须使用RequestContext
来显示对话框有关。这是因为当在form
的blur
事件中检查集合时,应该显示对话框。
首先,从InputText:
检查blur
事件<p:inputText id="customerIdInput"
value="#{newCustomerCaseController.id}"
label="custId" required="true">
<f:ajax event="blur" listener="#{newCustomerCaseController.performBackgroundSearch}" />
</p:inputText>
然后,在该blur
事件上,将在支持bean中调用侦听器方法,该方法通过RequestContext
显示对话框,如下所示:
public void performBackgroundSearch() {
showPopUpBecauseCertainConditionsAreMet();
}
public void showPopUpBecauseCertainConditionsAreMet() {
setExistingCustomerCases(customerCaseService.searchByEmployerId(employerId));
RequestContext.getCurrentInstance().update("caseform");
RequestContext.getCurrentInstance().execute(
"PF('employerAlreadyHasCustomerCasesDialog').show()");
}
}
下面是xhtml中的确认对话框和表:
<p:confirmDialog widgetVar="employerAlreadyHasCustomerCasesDialog" width="500" appendTo="@(body)" showEffect="fade" hideEffect="fade"
closable="false" >
<h:form id="caseform">
<p:dataTable id="casetable" var="custcase" rowKey="#{custcase.caseId}" value="#{newCustomerCaseController.existingCustomerCases}"
selectionMode="single" selection="#{newCustomerCaseController.selectedAlreadyExistingCustomerCase}" >
<p:ajax event="rowSelect" process="@this" listener="#{newCustomerCaseController.onExistingCaseRowSelect()}" />
<p:column headerText="caseId">
<h:outputText value="#{custcase.caseId}" />
</p:column>
</p:dataTable>
</h:form>
<!--some unimportant buttons which we don't touch in this example-->
</p:confirmDialog>
最后,让我们看看onExistingCaseRowSelect
侦听器方法的作用。它只尝试重定向,在导航到不同的url使用customerCase
的caseId
,我们试图在p:dataTable
中选择。
public void onExistingCaseRowSelect(SelectEvent event) {
try {
facesContext.getExternalContext().redirect("/customercase.xhtml?caseId=" + selectedAlreadyExistingCustomerCase.getCaseId());
}catch (Exception e) {
}
}
这里的问题是,当在表中单击selectedAlreadyExistingCustomerCase
时,它不会在支持bean中设置。当我单击表中的行时,正在设置null
。我在getter和setter中检查了printlines。我认为这里的问题是由于通过RequestContext.getCurrentInstance().update("componentName");
如何将表中单击的行值(即customerCase
)设置为支持bean中的选定值,而不是null
?
让它工作了。所以我是这样做的:我将带有数据表的对话框窗口和所有这些都放入ajax blur事件启动的相同表单中。但我从未让setter工作,它仍然是null。无论如何,正如@Kukeltje在评论中建议的那样,我使用了event.getObject(),它只有在将所有内容放入相同的形式后才能工作。