【问题标题】:JSF 2 + Primefaces: Need to update bean property on menu click before rendering dialogJSF 2 + Primefaces:需要在渲染对话框之前在菜单单击上更新 bean 属性
【发布时间】:2013-02-22 15:08:33
【问题描述】:

我有一个 p:menuitem,需要 (1) 在单击时更新支持 bean 属性,然后 (2) 显示一个 p:dialog。

这是我的设置:

<p:menuitem value="Show Dialog"
            oncomplete="dialog_widget.show();"
            update=":dialog"
            actionListener="#{bean.setCurrentAction}">
</p:menuitem>

<p:dialog widgetVar="dialog_widget" id="dialog" dynamic="true">
     <h:form>
        <p:inputText value="#{bean.record.text} />
     // the proper rendering of this dialog form depends on bean.currentAction
     // being set during JSF Phase 4 Update Model Values

</p:dialog>

还有后台bean:

public R getRecord() {
    if (currentAction == null) {
        return null;
    }
    return currentAction == NEW ? newRecord : selectedRecord;
}         

问题是 actionListeners 和动作只在第 5 阶段执行,我需要在此之前设置 bean.currentAction 以便可以正确更新和呈现对话框。

** 关于我要实现的目标的一点背景知识:对话框表单用于创建新记录以及更新现有记录(添加和编辑对话框)。因此 bean 上的“currentAction”指示用户正在执行的操作。根据具体的操作,表单需要使用不同的模型对象(“newRecord”或“selectedRecord”)来拉取和保存表单数据。

【问题讨论】:

  • 你的 bean 的作用域是什么?
  • 支持 bean 是 ViewScoped
  • 其实我很疑惑为什么表单要经过 Apply Request Values、Process Validations 和 Update Model Values。对话框表单是第一次显示,没有要应用和验证的内容。我假设 #{controller.record} 只会在 RenderResponse 期间解决。话虽如此,我通过添加 partialSubmit="true" 和 process="@this ..and 在我的情况下 table_id" 来限制处理范围来解决这个问题。但我想知道是否有更好的方法。
  • 对话框只是整个视图中的一个组件。整个视图贯穿生命周期的步伐
  • 所以在一个应用程序中,我们可能有许多(隐藏的)对话框和按钮来在一页中显示对话框,当用户只点击一个时,限制处理整个 ViewRoot 的最佳方法是什么?按钮执行一项操作?我正在使用“接受”方式的方法吗,它似乎有点难以维护......

标签: jsf-2 primefaces


【解决方案1】:

虽然不是一个非常优雅的解决方案,但您可以使用 PrimeFaces 的 RequestContext 的 update 方法来设置更新目标,并在设置所需的属性后使用 execute 方法在您的 actionListener 中显示您的对话框。

【讨论】:

  • 感谢您的建议,我会尝试一下。但是我真的很想避免在支持 bean 中硬编码 UI id 等......这似乎是一种常见的情况,所以我将看看是否有其他方法。
  • 我试过但没用。对话框显示,但表单字段不包含任何数据,即使它们应该包含。
【解决方案2】:

如果您要求在对话框打开之前调用支持 bean 方法,那么您可以使用 ajax 函数(我不知道您是否可以在应用程序中使用 ajax)。对于 p:menuItem 有一个名为 onclick 的函数,您可以在其中调用 a4j:ajax 函数,通过该函数您可以调用支持 bean 方法并在对话框打开之前更新模型.

【讨论】:

  • OP 明确表示他正在使用 Primefaces。请更新或删除您的答案
  • 我想过,但即使这种方法转化为 PF 中的等价物,这会是一种竞争条件——不可靠吗?
【解决方案3】:

默认情况下,在“调用应用程序”阶段调用操作。您可以在p:menuitem 标签中添加immediate="true" 属性。这将在“应用请求值”阶段调用操作。

【讨论】:

  • 我也试过了,但我无法完全绕过更新模型值,因为我的对话框可能会根据数据表选择显示数据(我的原始问题中未显示用例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2017-04-12
相关资源
最近更新 更多