【问题标题】:One <p:dialog> for multiple beans一个 <p:dialog> 用于多个 bean
【发布时间】:2015-09-15 13:39:38
【问题描述】:

我的总体布局中有一个&lt;p:dialog&gt;。我现在硬编码了它的Header 属性。

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

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

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

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

【问题讨论】:

  • 一些代码会有所帮助。

标签: jsf primefaces


【解决方案1】:

您可以将托管属性与您的一个托管 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

编辑:

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

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

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

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

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

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

【讨论】:

  • 您好,感谢您的回答。我试过了,但它没有更新标题。更改消息后我是否必须更新对话框?
  • 当然你必须更新对话框,这样标题才会改变。
  • 那么为此我必须从 bean 做一些事情。你能给我代码我如何访问 bean 中的对话框并更新它吗?
  • 它与 RequestContext.getCurrentInstance().update( "main-status-dialog" );但问题是当我更改它时,该值会永久更改。当前一个对话框已经显示时,它也不会实时更改值。我已经用@RequestScoped、视图和会话进行了尝试,但结果相同。
  • 据我所知,您不能永久执行此操作,您可以将更新属性与另一个组件(例如链接)一起使用,查看this link 或像我在 RequestContext 中提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2015-02-11
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多