`

ADF UncommittedDataWarning工作原理及autoSubmit元素的解决办法

 
阅读更多

ADF的UncommittedDataWarning机能使用两个标志来决定当前页面是否是编辑过的(即为脏的):

_hasLocalUncommitted用来标示客户端是否为脏状态,

_dataDirty是用来标示服务端是否为脏的状态。

 

1. 当用户在页面上编辑一个非autoSubmit的控件时,ADF框架会将_hasLocalUncommitted设置为true,因此当用户离开离开页面时,就会弹出下面的提示窗口

当用户试图关闭页面时,就会弹出下面的提示窗口。

 

2. 当用户在页面上编辑一个autoSubmit的控件时,ADF会提交一个PPR请求,请求的Response会包含下面的内容:

<script>AdfPage.PAGE.setDataDirty(false);</script>
<script>AdfPage.PAGE.setProcessedRoots("d2");</script>

其中的第一个javascript脚本会将_dataDirty设置为false,表明服务端不是脏的状态;第二个javascript脚本会将_hasLocalUncommitted设置为false,表明客户端不是脏的状态(前提是页面上无验证错误,当页面上有验证错误时,此处的脚本不会重置客户端的状态,因此客户端仍然为脏的状态)。所以当用户试图离开或者关闭页面时,就不会提示上面的提示窗口。

 

3. 当服务端的状态为脏时(当应用程序在请求页面时,修改了页面上绑定的数据源的值的时候,比如页面AB使用了同样的VO作为Model层绑定到了Page Definition文件中,当从页面A跳转到页面B的时候,在页面A的按的ActionListener当中修改了VO的行记录),那么在请求的页面的Response中会包含下面的内容:

<script type="text/javascript">
AdfBootstrap._extendedScripts=[function({AdfPage.PAGE.setDataDirty(true);}];
</script>

上面的javascript脚本会设置_dataDirty设置为true,表明服务端是脏的状态,因此当用户试图离开或者关闭页面时,就是提示上面的提示消息。

 

4. 当页面上有验证错误时,若用户操作了非autoSubmit的控件,那么客户端仍然保持脏的状态,若用户操了autoSubmit的控件,但是因为页面有验证错误,客户端的状态不会被重置,所以仍然为脏。因此当用户试图离开或者关闭页面时,就是提示上面的提示消息。

 

 

实际情况是,当用户在页面上进行了编辑操作后,无论他操作的是否为autoSubmit的控件,当他试图离开或者关闭页面时,都应该提示消息给用户。但是ADF提供的功能在用户操作autoSubmit的控件时,不起作用。那么该如何实现上述需求呢?

思路1

1.1. 添加一个dirty filed在页面上;

1.2. 给页面上的所有autoSubmit控件添加一个valueChange listener用来标示dirty filed

1.3. 给页面的definition文件文件设置一个状态监听器(controllerClass=PPRHookListener),当PPR请求完毕后,添加一段javascript脚本,用来检查dirty field。当dirty field不为空时,调用AdfPage.PAGE.setDataDirty方法,将当前页面设置为脏状态。

 

1.3步的java代码如下:

public class PPRHookListener implements PhaseListener {
	public void afterPhase(PagePhaseEvent pagePhaseEvent) {
	    FacesPageLifecycleContext ctx = 
		    (FacesPageLifecycleContext)pagePhaseEvent.getLifecycleContext();
	    if (pagePhaseEvent.getPhaseId() != Lifecycle.PREPARE_RENDER_ID) {
		    return;
		}
		
		if(AdfFacesContext.getCurrentInstance().isPostback() )
            FacesContext context = FacesContext.getCurrentInstance();
            ExtendedRenderKitService service = 
			    (ExtendedRenderKitService)Service.getRenderKitService
				(context, ExtendedRenderKitService.class);
			service.addScript(context, " markDirtyIfNeeded('dirtyFiledId');");
		}
	}
}

但是因为ADF框架会在上面添加的javascript之后,添加下面的重置状态的javascript脚本,导致上面添加的javascript又被覆盖了,因此此思路行不通。

<script>markDirtyIfNeeded('dirtyFiledId');</script>
<script>AdfPage.PAGE.setDataDirty(false);</script>
<script>AdfPage.PAGE.setProcessedRoots("d2");</script>

 

思路2

1.1. 添加一个dirty filed在页面上;

1.2. 给页面上的所有autoSubmit控件添加一个valueChange listener用来标示dirty filed

1.3. 重写当前页面的setDataDirty方法,检查dirty filed是否为空,当不为空时,则将当前页面设置为脏状态。

 

涉及到的代码如下:

// Use this method as page's load listener.
function overrideSetDataDirtyForPage(dirtyFieldId) {
    AdfPage.PAGE.setDataDirty = function(value) {
        AdfDhtmlPage.prototype.setDataDirty(value);
        
        var txtDirty = AdfPage.PAGE.findComponentByAbsoluteId(dirtyFieldId);
        if (txtDirty == null) {
            return;
        }
        
        var dirtyFlag = txtDirty.getValue();
        if (dirtyFlag == null || dirtyFlag == '') {
            return;
        }
        
        AdfDhtmlPage.prototype.setDataDirty(true);
    }
}

//Use this method as control's value change listener
function markDirty(dirtyFieldId) {  
    return function(evt) {  
        var txtDirty = AdfPage.PAGE.findComponentByAbsoluteId(dirtyFieldId);  
        if (txtDirty != null) {  
                txtDirty.setValue("dirty");  
        }  
    }  
}  

 

页面使用的代码如下:

<!-- Register load listener for the page -->
<af:clientListener method= overrideSetDataDirtyForPage('txtLocalDirtyFlg')" type="load"/>

<!-- Register value change listener for the autoSubmittted control-->
<af:selectOneChoice label="List"
    id="soc1"
    autoSubmit="true" 
    ....>
     <f:selectItems value="#{pageFlowScope.list}" id="si3"/>
     <af:clientListener type="valueChange" method="markDirty('txtLocalDirtyFlg')"/>
</af:selectOneChoice>

 此思路有效的避免了ADF框架的默认行为,可以解决上述问题。

 

 

 

 

  • 大小: 17.3 KB
  • 大小: 19.8 KB
0
0
分享到:
评论

相关推荐

    ADI公司锁相环芯片ADF4351设计原理图

    在设计ADI公司锁相环芯片ADF4351原理图时,电路工程师会根据实际的设计需求和应用环境,对上述元件进行精心布局和参数配置。原理图的设计不仅仅涉及到芯片的功能实现,更涉及到电路的稳定性、抗干扰性以及其它电子...

    verilog配置ADF4355

    首先,我们需要了解ADF4355的基本工作原理。ADF4355由一个锁相环(PLL)组成,可以产生精确的可调频率输出。它包括一个内置的压控振荡器(VCO)、分频器、鉴相器和数字控制逻辑。通过设置其内部寄存器,我们可以调整...

    ADF4350170119.rar_ADF4350 原理图_ADF4350.c\_stm8_原理图_频率表原理图

    **ADF4350原理详解** ADF4350是一款高度集成的频率合成器,由Analog Devices公司生产,主要用于无线通信、测试设备以及广播系统等应用中。它提供了广泛的频率范围,能够灵活地产生多种射频信号。在这个项目中,ADF...

    ADF4002锁相环模块ALTIUM设计硬件原理图+PCB工程文件.zip

    它可以用来理解锁相环的工作原理,掌握ALTIUM Designer的使用技巧,同时也能学习到2层板设计的实践经验和注意事项。 总结来说,这个资源包包含了从理论到实践的全面知识,不仅讲解了ADF4002锁相环模块的原理和应用...

    小数分频与快锁芯片ADF4193的原理与应用--千锋培训

    小数分频与快锁芯片ADF4193是现代通信系统中不可或缺的组件,尤其在数字移动...在嵌入式系统设计中,深入理解ADF4193的工作原理和配置方法,以及如何有效地测量其性能指标,对于实现高效、可靠的通信解决方案至关重要。

    ADF4351.rar

    2. **电源稳定性**:为确保ADF4351工作正常,需要提供稳定的电源,并可能需要额外的电源去耦和滤波。 3. **器件封装**:ADF4351采用48引脚LFCSP封装,需要注意焊盘间距和焊接工艺,防止短路或虚焊。 4. **滤波与匹配...

    宽带PLL ADF41513(1)_ADF_acceptwcc_adf4360_ADF41513_ADf4360-7_

    标题中的“宽带PLL ADF41513(1)_ADF_acceptwcc_adf4360_ADF41513_ADf4360-7_”提及了两个关键...通过理解这些器件的工作原理和特性,设计者能够构建出高效、精确的频率发生系统,满足各种无线通信和信号处理的需求。

    基于ADF4002锁相环模块AD09设计硬件(原理图+PCB)工程文件.zip

    锁相环是电子系统中用于同步数字信号或产生精确频率的常见技术,其工作原理是通过调整本地振荡器的频率,使其与输入信号的频率保持相位锁定。 在描述中提到,“硬件采用2层板设计”,这意味着PCB设计相对简单,减少...

    ADF4351配置程序.zip_ADF4351_ADF4351程式_adf4350配置_adf4351 程序_adf4351配置

    总结来说,ADF4351的配置涉及到多个参数的精确设定,这需要对器件的内部结构和工作原理有深入理解。通过C51编程,我们可以利用微控制器STC15L104E实现对ADF4351的灵活控制,从而在各种应用场景中产生所需的射频信号...

    ADF4350与MSP430控制原理图

    1. **ADF4350工作原理** ADF4350的核心是直接数字频率合成(DDS)技术,它通过高速相位累加器将数字输入转换为模拟相位,然后通过数字-模拟转换器(DAC)转换成电压信号,最后经过低通滤波器形成稳定的射频输出。...

    ADF检验MATLAB程序.zip_ADF单位根检验_ADF检测_MATLAB adf_adftest matlab_adf检验

    压缩包中的“ADF检验MATLAB程序.doc”文档可能详细介绍了如何使用MATLAB代码实现这些步骤,包括如何调用`adftest`函数,如何处理结果以及可能遇到的问题和解决方案。阅读这份文档将有助于深入理解和应用ADF检验。 ...

    ADF4351.rar_ADF4351_ADF4351锁相环例程_adf4351双路输出_adf4351辅助输出

    **锁相环工作原理** 锁相环是一种闭环控制系统,用于将参考频率与振荡器产生的频率同步。在ADF4351中,锁相环包括鉴相器(Phase Detector)、低通滤波器(LPF)和压控振荡器(VCO)。鉴相器比较输入参考信号与VCO...

    adf4351配置模板及配置软件

    在电子设计领域,ADF4351是一款高精度、可编程射频频率合成器,广泛应用于通信、测试设备以及各种无线系统中。该器件由ADI(Analog Devices, Inc.)公司制造,提供了灵活的频率设定和卓越的相位噪声性能。在本压缩包...

    adf4159.rar_FMCW_adf4159

    1. ADF4159芯片的基本工作原理和内部架构。 2. 直接数字频率合成(DDS)技术的工作流程。 3. C语言编程,特别是在嵌入式系统中的应用。 4. 微控制器或FPGA对ADF4159的控制接口,如SPI或I2C通信协议。 5. FMCW雷达的...

    ADF4351模块资料-V1.0

    通过阅读手册,开发者可以深入理解ADF4351的工作原理,优化系统设计,避免潜在的问题。 **总结** "ADF4351模块资料-V1.0"是一个全面的资源包,涵盖了从软件驱动到硬件设计的所有方面,为使用ADF4351和STM32进行...

    STM32 ADF4351

    STM32 ADF4351模块是针对射频(RF)系统设计的一款高精度、高性能的锁相环(PLL)解决方案。STM32是一款基于ARM Cortex-M内核的微控制器,而ADF4351则是一款由Analog Devices公司生产的可编程频率合成器,它们在无线...

    adf4351的驱动代码、中文数据手册、相关论文讲解,adf4350中文手册,C,C++

    在学习和应用这些资源时,开发者应该首先熟悉ADF4351的基本工作原理,理解其内部架构,然后通过数据手册确定合适的配置参数。接着,借助驱动代码了解如何与芯片进行通信,并根据需要修改或扩展驱动以满足特定需求。...

    ADF4001/ADF4002的驱动代码(基于正点原子MINISTM32)

    通过以上分析,我们可以看出,编写ADF4001/ADF4002驱动代码不仅涉及硬件接口的设计,还包含了对锁相环工作原理的深入理解。在实际项目中,开发者需要根据具体的应用场景,结合MINISTM32平台的特性,进行定制化的驱动...

    ADF4351驱动程序

    **ADF4351驱动程序**是针对Analog Devices公司的ADF4351 PLL(锁相环)...对于开发者来说,理解ADF4351的数据手册,熟悉MSP430的硬件接口和CCS的编程环境,以及深入掌握PLL的工作原理,都是成功实现驱动程序的关键。

Global site tag (gtag.js) - Google Analytics