Primefaces数据表项选择、确认对话框和RequestContext



EDIT:在视图构造时尝试填充集合后,一切都工作了,在该视图的支持bean类的@ postconstruct init()方法中。它是@ viewscope。因此,问题在于组件不知何故不能识别用作数据表值的集合,实际上具有值,因为它以一种不常见的方式填充。无论如何,如果我在视图构建时填充集合,一切都可以完美地工作。但这当然不是一个解决方案,因为集合必须在提到的模糊ajax事件上填充。所以这是某种生命周期/作用域问题。

EDIT2:我试图将表添加到与其中具有ajax模糊效果的组件相同的表单中,显示弹出框和该弹出框中的数据表并填充集合。这也奏效了。因此,ajax模糊事件和数据表功能的生命周期/范围是不同的,因为它们的形式不同。现在我应该设法保持他们在同一范围内,而在弹出对话框中的数据表。现在,出于上述测试目的,数据表笨拙地驻留在相同的形式中。

我在p:confirmDialog中有一个Primefaces p:dataTable,当我选择一个项目时,该项目的setter只获得null值。因此,设置了null值,下面的操作显然不起作用,因为我们没有值可以使用。

我认为这个问题与我必须使用RequestContext来显示对话框有关。这是因为当在formblur事件中检查集合时,应该显示对话框。

首先,从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使用customerCasecaseId,我们试图在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(),它只有在将所有内容放入相同的形式后才能工作。

相关内容

  • 没有找到相关文章

最新更新