如何修复Appmaker中的最大调用堆栈大小超出错误

时间:2019-05-17 09:55:42

标签: google-app-maker

Error I got

我当前正在验证日期框小部件,以防止在30天的宽限期后提交。日期验证工作正常,但是在警报提示之后,它并没有下降(即使单击几次,我仍然有库存)。而且日期框不会为空。

function checkDateValidate(widget) {
  var form = app.pages.Newitem.descendants;
  var otdate = form.otDateBox.value; 
  var date = new Date();
  var pastdate = date.setDate(date.getDate() - 31);

  if(otdate <= pastdate) {
    alert('Date exceeds within 30 days grace period is invalid.');
    form.otDateBox.value = null;
  }
}

我希望清除日期框小部件。

1 个答案:

答案 0 :(得分:0)

有时会发生此错误,因为正在进行无限循环,这是您的情况。了解 onValueChange 事件处理程序和 onValueEdit 事件处理程序之间的区别非常重要。

onValueChange

  

只要此小部件的value属性发生更改,此脚本就会在客户端上运行。可以使用参数Widget引用该Widget,并将其新值存储在newValue中。

onValueEdit

  

每当用户编辑此窗口小部件的值时,该脚本就会在客户端上运行。可以使用参数小部件来引用该小部件,并且该小部件的新值存储在newValue中。与onValueChange()不同,此操​​作仅在用户更改窗口小部件的值时才运行;它不会响应绑定或以编程方式设置该值时运行。


为什么会这样?

由于您的逻辑是在 onValueChange 事件处理程序上设置的,因此每次 dateBox 小部件值更改时都会触发此事件,即使是通过编程方式也是如此;因此,form.otDateBox.value = null;一遍又一遍地触发逻辑。一遍又一遍地触发它的原因是由于您的比较逻辑:

if(otdate <= pastdate)

此处,当转换为数字Number(null)时, otdate 的值变为,值为 0 (零) 。 pastdate 的值显然是一个大于零的数字,例如 1555413900712 。显然,零小于或等于1555413900712,这就是为什么您触发无限循环的原因。

因此,总而言之,只有一种方法可以解决此问题。在 onValueEdit 事件处理程序中设置逻辑,而不是在 onValueChange 中设置逻辑。