从bean顺序更新JSF组件

时间:2017-02-11 12:55:10

标签: jsf primefaces

我需要从我的支持bean执行另外三个动作,但第二个和第三个动作似乎在第一个完成执行之前被触发。

结果是调用了第二个/第三个动作但未执行。

如何设法执行第一个操作,等到完成后再开始第二个/第三个操作?

操作

  1. 关闭模态对话框窗口。这需要一秒钟来执行渲染。
  2.   。

    RequestContext.getCurrentInstance()执行(" PF(' dlgConfirmApplicationDelete'。)隐藏();&#34);

    1. 更新面板h:panelGroup组件
    2.   

      RequestContext.getCurrentInstance()更新(" j_idt3:panelGroupHolder&#34);

      1. 更新第二个小组h:panelGroup组件
      2.   

        RequestContext.getCurrentInstance()更新(" j_idt3:center_westBody&#34);

1 个答案:

答案 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,对话框保持可见。
  • 如果更新查询有效,数据确实会更改,两个ui元素都会更新(顺序无关紧要),并且由于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中已存在的列表。