多个 bean 一个 <p:dialog>

One <p:dialog> for multiple beans

我的总体布局中有一个 <p:dialog>。我目前对其 Header 属性进行了硬编码。

我想要的是从不同的 bean 访问它并根据我的选择在 运行 时间更改它的 Header

我目前正在使用它向用户显示加载消息,并希望根据当前后端处理更新加载文本,例如 "waiting for server's response" 等

<p:dialog id="main-status-dialog"
          widgetVar="mainStatusDialog"
          modal="true"
          header="Loading..."
          draggable="false"
          closable="false"
          resizable="false"
          appendToBody="true">

现在我在点击按钮时从不同的 JSF 页面调用它,例如 <h:link outcome="/generalInformation" value="General Information" onclick="mainStatusDialog.show()" /> 它工作正常但总是显示 "Loading..." 因为我有一个硬编码的属性。那么我怎样才能使它动态呢?请注意,我不想只对一个页面或 bean 执行此操作,但是从它访问它的任何页面,我都可以相应地更改 ist Header。 谢谢!

您可以将托管 属性 与您的其中一个托管 bean(例如 HeaderBean)的 @ManagedProperty 一起使用,并且每次都更改它相应地将 header 值设置为此值,它看起来会动态更新。

@ManagedProperty("#{headerBean}")
private HeaderBean headerBean;

并在您的 header 托管 bean 中创建一个 String 属性 value,您将在其中存储 header:[=26= 的值]

@ManagedBean(name = "headerBean")
@RequestScoped
public class HeaderBean implements Serializable
{
    private String value = null;

    // getter and setter methods

在你的p:dialog中:

<p:dialog id="main-status-dialog"
      widgetVar="mainStatusDialog"
      modal="true"
      header="#{headerBean.value}"
      draggable="false"
      closable="false"
      resizable="false"
      appendToBody="true">

查看以下链接以了解更多信息:

  1. The BalusC Code: Communication in JSF 2.0
  2. Injecting Managed beans in JSF 2.0
  3. @ManagedProperty - Inject one request scoped bean into another request scoped bean

编辑:

您可以使用 RequestContext 从 bean 更新对话框,如果您看一下 Better ajax operations and callbacks in JSF with PrimeFaces,您会看到:

RequestContext API enables developers to do 2 simple things. 1st you can tell what you want to update in the xhtml based on conditions in actions that you define in your Managed Beans.To update a component from serverside, you can just write:

从托管 bean 更新 p:dialog 所需的代码是:

RequestContext.getCurrentInstance().
          addPartialUpdateTarget("header_id");

您也可以像这样在 commandLink 中使用更新属性:

<h:link outcome="/generalInformation" value="General Information" oncomplete="mainStatusDialog.show()" update=":main-status-dialog"/>