在ADF中,可以在弹出窗口(af:popup)上添加表单来编辑数据。用户可以点击弹出窗口右上角的关闭按钮,来关闭弹出窗口。但是当用户希望在关闭按钮前弹出一个确认窗口,用户可以选择Yes或者No,来决定是否停留在当前的页面时,该如何实现呢?因为在ADF中,当用户点击了关闭按钮之后,弹出窗口是在客户端关闭完之才分发给服务端,因此即使在服务端添加了显示确认窗口的代码后,因为原来的父窗口已经关闭了,所以不能满足需求。所以虽然这是个简单的需求,我们需要做一些特殊的处理。
直观的有下面的两个思路。
思路一:
1. 给父窗口添加PopupCanceledEvent的服务端监听器,首先获得父窗口的对象将它显示出来,然后获得确认窗口的对象将它显示出来。
2. 给确认窗口添加服务端的DialogEvent的监听器,当用户选择Yes时候,关闭父窗口;否则停留在父窗口。
给编辑窗口添加服务端PopupCanceledEvent监听器:
<af:popup id="p2" binding="#{UserManagedBean.userPopup}"
popupCanceledListener="#{UserManagedBean.popupCancelListener}">
<af:panelWindow
id="pw4" title="Edit User" modal="true">
<f:subview id="userSubview ">
<jsp:include page="/pages/editUser.jsff"/>
</f:subview>
</af:panelWindow>
</af:popup>
监听器Java代码:
public void popupCancelListener(PopupCanceledEvent popupCanceledEvent) {
RichPopup userPop = (RichPopup)popupCanceledEvent.getComponent();
userPop.show(new RichPopup.PopupHints());
getCloseConfirmPopup().show(new RichPopup.PopupHints());
}
很不幸,这个思路在大多数情况下是不可行的。因为编辑窗口上定义的控件大多数都是非autoSubmit的。而ADF对于PopupCanceledEvent这一类型的事件是不会更新Model层的数据的。因此虽然我们通过代码又打开了已经关闭编辑窗口,但是在生成请求响应时(包括新的编辑窗口html代码,对应的javascript对象,以及将二者绑定到一起的javascript代码等),会使用当前的Model层的数据,显然最终导致了用户输入的数据的丢失(除非控件是autoSubmit的,因为此时Model层在控件值发生变化的时候已经被ADF框架更新了)。这个显然是不符合需求的。
思路二:
1. 给父窗口添加popupCanceled客户端监听器,首先获得父窗口的对象将它显示出来,然后获取确认窗口的对象将它显示出来,最后取消popupCanceled事件的传递。
2. 给确认窗口添加服务端的DialogEvent的监听器,当用户选择Yes时候,关闭父窗口;否则停留在父窗口。
给编辑窗口添加客户端popupCanceled监听器:
<af:popup id="p2" binding="#{UserManagedBean.userPopup}"
<af:clientListener type="popupCanceled" method="onCloseConfirmPopup"/>
<af:panelWindow id="pw4" title="Edit User" modal="true">
<f:subview id="userSubview">
<jsp:include page="/pages/editUser.jsff"/>
</f:subview>
</af:panelWindow>
</af:popup>
监听器Javascript代码:
function onCloseConfirmPopup(evt){
var eventSource = evt.getSource();
eventSource.show();
//the confirm popup is defined in editUser.jsff file.
var confirmPop =
AdfPage.PAGE.findComponentByAbsoluteId("userSubview:confirmPopup");
confirmPop.show();
evt.cancel();
}
此思路将显示确认窗口的代码移动到了客户端,因此有效的避免了因为PopupCanceledEvent向服务器端分发而导致的用户数据的丢失问题。因此此思路是可行的。
确认窗口的服务端DialogEvent的监听器:
public void closeConfirmPopListener(DialogEvent dialogEvent) {
if (Outcome.no.equals(dialogEvent.getOutcome())) {
return;
}
findUserPopup().hide();
}
相关的几个文档链接:
Working with popups in ADF
Handling the af:dialog Ok and CANCEL buttons
分享到:
相关推荐
ADF Table 选中某行,popup弹出编辑和添加例子
arcgis java adf 点击地图弹出气泡
ADF41513中文手册
ADF4351结合外部环路滤波器和外部参考频率使用时,可实现小数 N分频或整数 N分频锁相环 (PLL)频率合成器。
ADF4350中文资料!!免费下载!
ADF4351配置程序,主要是C51配置ADF5351/4350
纯手工打造,略显粗糙
ADF5355与外部环路滤波器和外部参考频率一起使用时,可实现小数N分频或整数N分频锁相环(PLL)频率合成器。ADF5355具有宽带微波VCO,一个射频(RF)输出从6.8 GHz到13.6 GHz的频率,另一个频率输出在一系列分频器...
ADF4001中文数据手册
英文版的,中文版还在找。貌似中文的ADF设计网上都是付费购买的。。。。
在ADF的Table中,我们能实现在表格中添加,编辑,删除行的功能,以及一行数据中的级联。然而在多数时候,当一行的列太多,表格中的数据量不多的时候,这种在table中直接添加的方式则显得很不友好,因为要来回的拉动...
adf4351的驱动代码、中文数据手册、相关论文讲解
ADF4159中文资料,ADF4159是一款具有调制、以及快速和慢速波形产生能力 的13 GHz小数N分频频率合成器,该器件使用25位固定模数, 提供次赫兹频率分辨率。
基于80c51f芯片控制的频率合成器adf4360-7
adf4351的驱动代码、中文数据手册、相关论文讲解
ADF41513 数据手册.PDF
ADF4350的全中文datasheet,由英文文档直译,和大家分享一下
高性能窄带收发IC的官方器件资料,中文的,比看英文的轻松多了
stm32平台的ADF4002锁相环芯片驱动程序