找回密码
 立即注册

QQ登录

只需一步,快速开始

IvanBy
金牌服务用户   /  发表于:2017-6-5 16:27  /   查看:6651  /  回复:15


在这个帖子提到过自定义数据验证的http://gcdn.gcpowertools.com.cn/forum.php?mod=viewthread&tid=37521&extra=

现在发现有个问题,如果数据验证不通过,ValidationError事件触发有问题。比如第一次输入不正确的数据,单元格标红了,但没ValidationError,要第二次输入不正确的数据,才会ValidationError。

15 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 16:49:45
沙发
我刚试了下,没有出现您所描述的问题,一下是我在之前demo上修改后的新demo,您可以下载下来对比看一下。
这个demo中只要第一次输入出现错误就会有错误提示。

SpreadJS_CustomFormulaDataValidation_V9.zip

1.26 KB, 下载次数: 158

回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:09:03
板凳
ClarkPan 发表于 2017-6-5 16:49
我刚试了下,没有出现您所描述的问题,一下是我在之前demo上修改后的新demo,您可以下载下来对比看一下。
...

我是把它直接绑定到spread对象上
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 17:16:36
地板
IvanBy 发表于 2017-6-5 17:09
我是把它直接绑定到spread对象上

我试了也没问题啊,要不您把您的demo上传我帮您看看。
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:26:28
5#
ClarkPan 发表于 2017-6-5 17:16
我试了也没问题啊,要不您把您的demo上传我帮您看看。

奇怪了,我用Demo测试也没问题。我集成的关联太多了,上传有点麻烦,我再调试看看
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:27:52
6#
ClarkPan 发表于 2017-6-5 17:16
我试了也没问题啊,要不您把您的demo上传我帮您看看。

知道了,可能是我的evaluate那有问题。我的是这样的
  1. RegExFunction.prototype.evaluate = function () {
  2.             var context = arguments[1],
  3.                      value = context.source.getValue(context.row, context.column),
  4.                      text = context.source.getSheet().getText(context.row, context.column);
  5.          
  6.             if (text === "") {
  7.                 return true;
  8.             }
  9.             var exp = arguments[0];
  10.             if ($.isArray(exp)) {
  11.                 exp = exp[0];
  12.             }
  13.             if (exp.indexOf("/") == 0) {
  14.                 try {
  15.                     var reg = eval(exp);
  16.                     return reg.test(text);
  17.                 } catch (e) {

  18.                 }
  19.             }
  20.             return new RegExp(exp).test(text);
  21.         }
复制代码
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:34:22
7#
IvanBy 发表于 2017-6-5 17:27
知道了,可能是我的evaluate那有问题。我的是这样的

另外,我是这样绑定的,好像这样绑定也会有问题?
SpreadJS_CustomFormulaDataValidation_V9.html (3.52 KB, 下载次数: 134)
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 17:36:55
8#
本帖最后由 ClarkPan 于 2017-6-5 17:38 编辑
IvanBy 发表于 2017-6-5 17:27
知道了,可能是我的evaluate那有问题。我的是这样的

嗯,换了您提供的代码重现了问题,原因是这样的,evaluate的触发是在填写值之后,editend之前,所以那个时候用context.source.getSheet().getText(context.row, context.column);拿不到您填写的值,所以第一次会有问题。第二次其实取得时候也会有问题,因为拿到的是第一次填写上去的值。其实value = context.source.getValue(context.row, context.column),这个拿到的就是您填写的值。
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:39:00
9#
ClarkPan 发表于 2017-6-5 17:36
嗯,换了您提供的代码重现了问题,原因是这样的,evaluate的触发是在填写值之后,editend之前,所以那个 ...

因为如果不是getText,输入日期格式的时候,它会自动转为日期对象,验证就无效了。比如输入 2017-6-5 ,就会被转为日期对象,验证就有问题了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 17:51:37
10#
IvanBy 发表于 2017-6-5 17:39
因为如果不是getText,输入日期格式的时候,它会自动转为日期对象,验证就无效了。比如输入 2017-6-5 , ...

看您的意思是需要校验时间,那么用value获得的就是一个JS源生的date类型,您可以根据您的需求调用其中的方法来进行判断,例如value.getTime(),value.getDate()等等。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部