我需要从我的支持bean执行另外三个动作,但第二个和第三个动作似乎在第一个完成执行之前被触发。
结果是调用了第二个/第三个动作但未执行。
如何设法执行第一个操作,等到完成后再开始第二个/第三个操作?
操作
。RequestContext.getCurrentInstance()执行(" PF(' dlgConfirmApplicationDelete'。)隐藏();&#34);
h:panelGroup
组件RequestContext.getCurrentInstance()更新(" j_idt3:panelGroupHolder&#34);
h:panelGroup
组件RequestContext.getCurrentInstance()更新(" j_idt3:center_westBody&#34);
答案 0 :(得分:3)
我需要在数据库中执行一个操作,具体取决于 结果我需要关闭窗口,并在更新其他两个后立即关闭 panelGroups包含更新的信息
您可以在不调用java代码的操作的情况下执行此操作。
在不知道确切布局的情况下,您要求的任务通常如下所示:
<p:commandLink
process="@form"
actionListener="#{bean1.updateDatabase}"
update="j_idt3:panelGroupHolde;j_idt3:center_westBody"
oncomplete="if (args.updateSuccessfull) PF('dlgConfirmApplicationDelete').hide();">
并在bean1.updateDatabase
方法内,根据查询的实际结果指定args.updateSuccessfull
。
Boolean updateSuccessfull = false;
RequestContext.getCurrentInstance().addCallbackParam("updateSuccessfull", updateSuccessfull);
在您提到的示例中,订单并不重要,因为每个操作都有预定的结果,并且专用于生命周期中的某个阶段(更新始终在完成之前):
update=
没有影响,并且由于CallBack-Param,对话框保持可见。 如果不是这种情况,那么你在RenderResponse
- 阶段内有代码,而不是在InvokeApplication
阶段(或更早)执行。
导致后者的常见错误是调用包含重码的方法&#34;来自xhtml(而其他列表(&#34;第二次更新&#34;)也取决于那些值),例如
<ui:repeat values="#{bean1.queryDatabaseForXY()}" ...>
显然现在SECOND更新需要在第一次更新之后,因为它还需要来自bean1.queryDatabaseForXY()
的一些数据。
而不是你应该在适当的阶段执行数据加载和/或计算,并在生成响应时简单地引用getter
返回已知的集合:
<ui:repeat values="#{bean1.getUsers()}" ...>
或更准确
<ui:repeat values="#{bean1.users}" ...>
(实际加载可以是@PostConstruct
,<f:viewAction>
,也可以只是视图或会话范围内的bean中已存在的列表。