2

我有 ap:menuitem 需要 (1) 单击时更新支持 bean 属性,然后 (2) 显示 ap: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”)来拉取和保存表单数据。

4

3 回答 3

0

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

于 2013-02-22T17:33:58.350 回答
0

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

于 2013-02-22T15:19:29.310 回答
0

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

于 2013-02-22T16:54:17.927 回答