JSF 2 + Primefaces:需要在渲染对话框之前更新菜单上的bean属性

时间:2013-02-22 15:08:34

标签: jsf-2 primefaces

我有一个p:menuitem需要(1)点击后更新支持bean属性,然后(2)显示一个p:对话框。

这是我的设置:

<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和actions只在第5阶段执行,我需要在此之前设置bean.currentAction,以便可以正确地更新和呈现对话框。

**关于我想要实现的目标的一些背景:对话框表单用于创建新记录以及更新现有记录(添加和编辑对话框)。那么&#34; currentAction&#34;在bean上指示用户正在执行的操作。根据哪个动作,表单需要使用不同的模型对象(&#34; newRecord&#34;或&#34; selectedRecord&#34;)来拉取表单数据并将其保存到。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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