Jsf 2 JSF2&x2B;Primefaces:在渲染对话框之前,需要更新菜单上的bean属性

Jsf 2 JSF2&x2B;Primefaces:在渲染对话框之前,需要更新菜单上的bean属性,jsf-2,primefaces,Jsf 2,Primefaces,我有一个p:menuitem,它需要(1)在单击时更新backingbean属性,然后(2)显示一个p:dialog 这是我的设置: <p:menuitem value="Show Dialog" oncomplete="dialog_widget.show();" update=":dialog" actionListener="#{bean.setCurrentAction}"> </p:menuite

我有一个p:menuitem,它需要(1)在单击时更新backingbean属性,然后(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>
问题是actionListeners和actions只在第5阶段执行,我需要在此之前设置bean.currentAction,以便正确更新和呈现对话框


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

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

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

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

谢谢您的建议,我将尝试一下。然而,我真的想避免在支持bean中硬编码UI ID等。。。这似乎是一个常见的场景,所以我要看看是否有其他方法。我尝试过,但没有成功。对话框出现了,但是表单字段不包含任何数据,即使它们应该包含。bean的作用域是什么?支持bean是ViewScope。实际上,我很困惑表单为什么必须经过应用请求值、流程验证和更新模型值。对话框窗体是第一次显示,没有要应用和验证的内容。我假设#{controller.record}只能在RenderResponse期间解析。话虽如此,我还是通过添加partialSubmit=“true”和process=“@this..以及在我的例子中的table_id”来解决这个问题,以限制处理的范围。但是我想知道是否有更好的方法。对话框只是整个视图中的一个组件。在一个应用程序中,我们可能有许多(隐藏的)对话框和按钮在一个页面中显示对话框。当用户只单击一个按钮执行一个操作时,限制整个ViewRoot处理的最佳方式是什么?我用的是“被接受”的方式,只是看起来有点难以维持……OP明确表示他使用的是Primefaces。请更新或删除您的答案我考虑过了,但即使这种方法转换为PF中的等效方法,这会是一种竞争条件吗?不可靠?我也尝试过,但我不能完全绕过更新模型值,因为我的对话框可能会显示基于数据表选择的数据(我的原始问题中没有显示用例)。
public R getRecord() {
    if (currentAction == null) {
        return null;
    }
    return currentAction == NEW ? newRecord : selectedRecord;
}