多个bean的一个<p:dialog>

时间:2015-06-29 07:13:49

标签: jsf primefaces

我的总体布局中有一个<p:dialog>。我现在有Header属性硬编码。

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

我正在使用它向用户显示加载消息,并希望根据当前后端处理更新加载文本,例如“等待服务器的响应”等。

<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()" /> 它工作正常,但总是显示“正在加载...”,因为我有一个硬连接的属性。那我怎么能让它变得动态呢?请注意,我不想只对一个页面或bean执行此操作,但是从它访问它的任何页面,我都可以相应地更改ist Header。 谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

在您的标头托管bean中创建一个String属性value,您将在其中存储标头的值:

@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
  4. 编辑:

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

      

    RequestContext API 使开发人员能够做两件简单的事情。首先,您可以根据您在Managed Beans中定义的操作条件,在xhtml中告诉您要更新的内容。要从服务器端更新组件,您只需编写:

    从托管bean更新p:对话框所需的代码是:

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

    您还可以在commandLink中使用update属性,如下所示:

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