【问题标题】:Ajax component updates before actionListener called?在调用 actionListener 之前 Ajax 组件更新?
【发布时间】:2012-04-25 14:35:32
【问题描述】:

我正在使用 PrimeFaces <p:dialog> 来启动一个弹出 html 页面并使用 <p:commandButton> 来关闭它:

这是按下确定按钮时我所做的:

<p:commandButton id="submitButton" 
    value="OK" 
    actionListener="#{MultiFileSelectMgmtBean.actionOk}" 
    update=":formID:fileTreeID" 
    oncomplete="dlg1.hide();"/>

问题是fileTreeID 在动作侦听器完成之前更新。 如何强制先调用actionOk(),然后再更新fileTreeID

编辑

问题是弹出页面 B (BackingBeanB) 需要计算并保存父页面 A 在其 BackingBeanA::BackingBeanAconstructor 中加载和使用的一些值。发生的情况是父页面 A 在子页面 B 调用其BackingBeanB::actionOk() 之前构造。需要更新的组件fileTreeID在页面A中,并且依赖于页面A构造函数中计算的值,因此它使用旧值更新,而不是使用BackingBeanB::actionOk()中要计算的新值。

【问题讨论】:

  • 这不是真的。要么你误解了问题,要么原因在其他地方。
  • @BalusC:我已经编辑了问题,请检查现在是否更清楚?

标签: ajax jsf primefaces actionlistener


【解决方案1】:

您的 bean 显然在请求范围内。而是将 bean 放在视图范围内。

@ManagedBean
@ViewScoped
public class BeanA {}
@ManagedBean
@ViewScoped
public class BeanB {}

这样,只要您与同一个视图交互,bean 就会一直存在,并且不会在每个 HTTP 请求上重新构建。

update 绝对不会在之前执行该操作。支持 bean 的可能构造不一定只在呈现响应期间执行。它可能已经在恢复视图阶段发生了。

【讨论】:

  • 您建议如何将值从子“页面”B 传递给父 A?到目前为止,我所做的是将其保存在 Map&lt;String,Object&gt; sessionVars = FacesContext.getExternalContext().getSessionMap(); 中,然后将其保存在 B 页中的 sessionVars.put 和 A 页中的 sessionVars.get 中。
猜你喜欢
  • 1970-01-01
  • 2015-07-11
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多