【发布时间】: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