壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1949|回复: 3

[OAF] oaSubTabLayout展示数据时的bug

[复制链接]
发表于 2011/5/10 17:10:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近一同事在做页面的时候发现一个问题:
1.新建页面TestPG,建subTabLayout区域:SubRN。在SubRN下Region1,region2对应subTabBar1下的link1,link2。并在TestCO中的processRequest方法中加入
        OASubTabLayoutBean subBean =
            (OASubTabLayoutBean)webBean.findChildRecursive("region2");
        subBean.setAttributeValue(MODE_ATTR, SUBTAB_FORM_SUBMISSION_MODE);

这段代码可以让页面在切换tab的时候不初始化页面。

2.新建VO:TestVO。VO中有字段,ROFlag(初始值为“true”),CheckFlag(初始值为“Y”)。

3.在Region2下,新建CheckBox :item1和SubmitButton:button1.item1的ReadOnly术语绑定TestVO中的ROFlag字段,item1的值绑定CheckFlag字段。

4.设置SubRN Initial subTab为0.即初始化时,显示Region1. 运行TestPG,切换tab页到region2.检查页面发现复选框item1勾上并且只读,和VO中的一致。

5.点击button1,发现item仍然只读,但勾被去掉。

6.如果在第4步是设置Initial subTab为1.即初始化时,显示Region2.则不会出现这个问题。



经在下研究推测发现,在点击button1之后,在TestCO执行processFormRequest之前,TestCO会调用它的processFormData方法。该方法会调用页面下每个Render为true的Region的processFormData。然后每个Region的processFormData会调用每个Render为true的Item的方法,在每个Item的processFormData中,如果item的值绑定VO的字段,item的ReadOnly属性为false(当item的readOnly属性为绑定VO字段,则被当作false处理),且参数_hdfp+[item_name]的值不为_oa_dis,则processFormData会把参数[item_name]赋值给VO中的字段,以此达到页面数据和VO中数据的同步。

然后分析上面的Bug:在页面初始化之后切换tab到region2区域。此时region1的render属性为true,region2的render属性为false,所以processFormData不会处理region2中的数据。当显示region2之后,点击button1,此时region2的render属性为true,所以item1的processFormData会把参数[item_name]复制给绑定的VO字段。而OAF生成的页面中,如果item的readOnly属性为true,它的[item_name]对应的参数值永远为空。所以processFormData方法把null赋值给item1绑定的字段,所以勾选去掉。

为什么第六步不会出错呢?因为在页面初始化时,OAF生成页面时会为每个显示的只读的item生成一个type为hidden的input标签,标签的名称为_hdfp[item_name]值为_oa_dis开头。所以当页面初始化时,若显示region2,则会为item1生成一个_hdfpitem1的标签,而在页面提交时,因为参数_hdfpitem1为_oa_dis开头所以不对VO赋值。所以vo中的值不变。如果页面初始化时,不显示region2。而在切换tab到region2时,不会为item1生成_hdfpitem1的标签。

问题:为什么页面初始化显示不是region2,切换tab之后不会为region2下的item1生成_hdfpitem1标签?


望大家能帮忙指正我描述的过程中错误或不足的地方。并帮忙解答上面的问题。
发表于 2011/5/11 09:44:05 | 显示全部楼层
按照你的描述,情景的确可以再现。

我简单的研究了一下,你参考一下。

1、当messageCheckBox的item1的只读属性是Flase的时候,当触发submit的时候,控件会保留原来的状态。
2、当messageCheckBox的item1的只读属性是TRUE的时候,当触发submit的时候,控件会自动变成不被选中的状态。

综上两种情况,可以分析出:
在触发submit的时候,processFormData()方法会判断,当messageCheckBox的item1的只读属性是TRUE的时候,自动将TestVO1.ROFlag的属性设置成“N”。

解决策:
在TestVORowImpl.java文件中重写setCheckFlag()方法
变更前:
  public void setCheckFlag(String value)
  {
    setAttributeInternal(CHECKFLAG, value);
  }

变更后:
  public void setCheckFlag(String value)
  {
    if (getROFlag() == null || !getROFlag().booleanValue())//如果ROFlag属性是true的时候,就不改变CheckFlag的值。
    {
      setAttributeInternal(CHECKFLAG, value);
    }
  }

备注:重写setCheckFlag方法的目的,是为了在某种特定的条件下去更新CheckFlag属性的值,
当然,你可以根据实际业务的需要,更改这个if条件语句。

谢谢。
 楼主| 发表于 2011/5/11 16:49:01 | 显示全部楼层
回复 sumury 的帖子

谢谢sumury的回复。这样做确实可以解决这个问题。只是这样当ROnlyFlag为true时,我就无法在processFormRequest中修改CheckFlag了。我发现其实只要在co中复写processFormData方法就可以修复这个问题。
    public void processFormData(OAPageContext pageContext, OAWebBean webBean) {
        OAApplicationModule am = pageContext.getApplicationModule(webBean);
        Row row = am.findViewObject("Test1VO").first();
        if((boolean)row.getAttribute("ROnlyFlag")){
            pageContext.putParameter("_hdfpitem1","_oa_dis");
        }
        super.processFormData(pageContext, webBean);
    }
这样就不会VO中的数据冲掉。


我的疑问是:OAF在生成页面时,会为每个只读item生成一个标签
<input id="XX" type="hidden" value="_oa_dis...." name="_hdfp[item_name]">
在提交表单时会传递一个_hdfp[item_name]参数,值为_oa_dis开头。
但在本例中,当在页面初始化时,不显示region2。那麽切换tab到region2时,不会为region2下的只读item生成标签。
为什么会这样?



发表于 2011/5/12 22:25:11 | 显示全部楼层
因为OASubTabLayoutBean在初始化的时候,只对显示的tab中的可视控件进行初始化。

所以,就如你所说的,

初始化时显示region2的时候,是正常的,

而非初始化时,显示region2时,就是不正常的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 15:24 , Processed in 0.012459 second(s), 16 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表