起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8333|回复: 25

[结贴] 关于事件自动触发问题

[复制链接]

55

主题

242

帖子

790

积分

高级会员

Rank: 4

积分
790
QQ
发表于 2014-6-7 17:04:21 | 显示全部楼层 |阅读模式
版本: 小版本号:
数据库: 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
本帖最后由 lz_net 于 2014-6-7 17:13 编辑

X5的事件触发是不是限制只执行一次?

例如:
a值改变,触发A事件,A事件触发B事件,B事件触发C事件。

问题在于如果各个事件的数据为多行,遍历时不会重复触发。

有什么办法改变呢?

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 00:30:00 | 显示全部楼层
本帖最后由 腹部流出的肉 于 2014-6-8 00:35 编辑

1.事件触发并不是限制只能一次。比如说xforms:input有onFocus  onChange onBlur 等事件
  其中onFocus事件就能触发多次,当鼠标在input进进出出时就触发了这个事件,其他的也是一样的
2."问题在于如果各个事件的数据为多行,遍历时不会重复触发。有什么办法改变呢"没明白

在一个事件触发时调用另一个事件触发函数就可以实现了嘛

如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

55

主题

242

帖子

790

积分

高级会员

Rank: 4

积分
790
QQ
 楼主| 发表于 2014-6-8 20:29:09 | 显示全部楼层
腹部流出的肉 发表于 2014-6-8 00:30
1.事件触发并不是限制只能一次。比如说xforms:input有onFocus  onChange onBlur 等事件
  其中onFocus事件 ...

问题是这样的:我有一个4级的主从表,想改变第一级表中的某个值时,自动将其余几级的表对应的值也更改。

现在用onValueChanged事件来做触发,结束只能影响更改时焦点所在的行的值。

即:
表A:
行aa,值a1;//改变a1值
表B:
行ba,值b1;//对应a1
行bb,值b2;//对应a1
行bc,值b3;//对应a1
……

表C:
行ca,值c1;//对应ba行
行cb,值c2;//对应bb行
行cc,值c3;//对应bc行
……

表D:
行da,值d1;//对应ca行
行db,值d2;//对应cb行
行dc,值d3;//对应cc行
……


执行后有影响的数据是:b1、b2、b3、c1、d1
回复 支持 反对

使用道具 举报

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 23:03:37 | 显示全部楼层
本帖最后由 腹部流出的肉 于 2014-6-8 23:10 编辑

你的意思是说,a1改变后要触发B表相应行的值改变,B表值变要触发C表相应行的值改变,c表值变要触发D表相应行的值改变

a1改变后,B表中记录的外键是A表改变记录主键的统统改变,C表中记录的外键是B表改变记录主键的统统改变,D表中记录的外键是C表改变记录主键的统统改变

此处a1改变要导致 b1/b2/b3 c1/c2/c3 d1/d2/d3的改变

假如 有对应四个bizData 分别为bizDataA bizDataB bizDataC bizDataD

现在问题的关键是找到:bizDataA中到底是哪一行改变了

具体看
  1. public onValueChanged(object event)
  2. [回调型事件]数据变化
  3. 参数:
  4. object event
  5. 结构如下:

  6. {
  7. "source" : 组件的js对象,
  8. "column" : 关系,
  9. "rowIndex" : 行索引,
  10. "value" : 新值,
  11. "originalValue" : 旧值
  12. }
复制代码
如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 23:08:41 | 显示全部楼层
如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

55

主题

242

帖子

790

积分

高级会员

Rank: 4

积分
790
QQ
 楼主| 发表于 2014-6-8 23:15:19 | 显示全部楼层
腹部流出的肉 发表于 2014-6-8 23:03
你的意思是说,a1改变后要触发B表相应行的值改变,B表值变要触发C表相应行的值改变,c表值变要触发D表相应 ...

bizDataA是最高层的主表,中只有一行,作为流程转用的。bizDataA中某一字段作为订单号。当这个订单号有变化时,应自动更改各明细表的订单号。

我在JS中的设置是:A表订单号列有变化时,填充B表订单号列;B表订单号列有变化时,填充C表订单号列;C表订单号列有变化时,填充D表订单号列。

现在的问题是B表第二行及之后对应的所有明细数据,订单号列都没有变化。
回复 支持 反对

使用道具 举报

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 23:28:53 | 显示全部楼层
本帖最后由 腹部流出的肉 于 2014-6-8 23:36 编辑

  1. xxxActivity.bizDataAValueChanged = function(event){
  2.     var bizDataA = justep.xbl("bizDataA");
  3.     var curRowIDA = bizDataA.getID(event.rowIndex);
  4.     var bizDataB = justep.xbl("bizDataB");
  5.     bizDataB.first();
  6.     var rowsB = bizDataB.getCount();
  7.     for(var i = 0;i < rowsB;i++){
  8.         var curRowIDB = bizDataB.getCurrentRowId();
  9.         if(bizDataB.getValue("relationName",curRowIDB) == curRowIDA){ //外键字段
  10.             bizDataB.setValue("relationName",newValue,curRowIDB);//newValue为业务处理后的值
  11.         }
  12.         bizDataB.next();
  13.    }
  14.    bizDataB.saveData();
  15.    bizDataB.refreshData();
  16. }
  17. //其他以此类推... ...
复制代码
如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 23:30:08 | 显示全部楼层
你使用了bizDataB的first() next()方法了吗
如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-6-8 23:37:54 | 显示全部楼层
lz_net 发表于 2014-6-8 23:15
bizDataA是最高层的主表,中只有一行,作为流程转用的。bizDataA中某一字段作为订单号。当这个订单号有变 ...

看看这个方法可以吗
如果我说对了 请别忘记点赞.
回复 支持 反对

使用道具 举报

55

主题

242

帖子

790

积分

高级会员

Rank: 4

积分
790
QQ
 楼主| 发表于 2014-6-8 23:55:32 | 显示全部楼层
本帖最后由 lz_net 于 2014-6-8 23:57 编辑
腹部流出的肉 发表于 2014-6-8 23:30
你使用了bizDataB的first() next()方法了吗

mainActivity.HX_LZZBValueChanged = function(event){//表A   
   if(event.column == 'fTZDH'){
//填充交货计划表通知单号
      var fTZDH = justep.xbl('HX_LZZB').getValue('fTZDH');
      var HX_JHJH = justep.xbl('HX_JHJH');
      for(var i=0;i<HX_JHJH.getCount();i++){
          var rowID = HX_JHJH.getID(i);
          HX_JHJH.setValue('fTZDH', fTZDH, rowID); //填充表B值
          }   
     }         
};

mainActivity.HX_JHJHValueChanged = function(event){//表B   
    if(event.column == 'fTZDH'){
    //填充交货计划明细表通知单号
       var HX_JHJHMX = justep.xbl('HX_JHJHMX');
       var fTZDH = justep.xbl('HX_JHJH').getValue('fTZDH');
       for(var i=0;i<HX_JHJHMX.getCount();i++){
           var rowID = HX_JHJHMX.getID(i);
           HX_JHJHMX.setValue('fTZDH', fTZDH, rowID); //填充表C值
          }        
      }
};


mainActivity.HX_JHJHMXValueChanged = function(event){//表c  
    if(event.column == 'fTZDH'){
    //填充生产计划细分表通知单号
       var HX_SCJHXF = justep.xbl('HX_SCJHXF');
       var fTZDH = justep.xbl('HX_JHJHMX').getValue('fTZDH');
       for(var i=0;i<HX_SCJHXF.getCount();i++){
           var rowID = HX_SCJHXF.getID(i);
           HX_SCJHXF.setValue('fTZDH', fTZDH, rowID); //填充表D值
          }      
      }
};

我用FOR遍历,不过后面的事件只触发一次,导致不过完全修改对应字段的值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-6-17 06:08 , Processed in 0.080478 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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