Javascript 未捕获范围错误:超过Meteor.js表单的最大调用堆栈大小

Javascript 未捕获范围错误:超过Meteor.js表单的最大调用堆栈大小,javascript,jquery,meteor,Javascript,Jquery,Meteor,我有一个正在提交的表单(并使用reactiveVar在提交时更改视图中的输出)。每当我成功提交时,我都会遇到这样一个不祥的错误: Uncaught RangeError: Maximum call stack size exceeded isArguments @ es5-shim.js:888 keys @ es5-shim.js:951 _.each._.forEach @ underscore.js:111 EJSON.clone @ ejson.js:500 (anonymous fun

我有一个正在提交的表单(并使用reactiveVar在提交时更改视图中的输出)。每当我成功提交时,我都会遇到这样一个不祥的错误:

Uncaught RangeError: Maximum call stack size exceeded
isArguments @ es5-shim.js:888
keys @ es5-shim.js:951
_.each._.forEach @ underscore.js:111
EJSON.clone @ ejson.js:500
(anonymous function) @ ejson.js:501
_.each._.forEach @ underscore.js:113
EJSON.clone @ ejson.js:500
(anonymous function) @ ejson.js:501
_.each._.forEach @ underscore.js:113
EJSON.clone @ ejson.js:500
我在someview.js中有两个事件处理程序:

Template.inquiry.events({
  'click .submit': function(event, template) {
    var $form = template.$('#request-form');

    if ($form.valid()) {
          template.showForm.set( false );

          Meteor.setTimeout( function() {
            template.showForm.set( true );
          }, 10000); // Reset after 10 seconds.
    }
  },
});

Template.inquiry.events({
    'submit form': function(event) {
        event.preventDefault();
        var name = event.target.name.value;
        var email = event.target.email.value;

        UserList.insert({
            name: name,
            email: email
        });
    }
});
和一个助手来获取初始的reactiveVar(showForm):


为什么会出现此错误?

您不应该同时触发两个事件。单击按钮的那一刻,表单也会被提交(我相信
超时
会在提交和单击之间进行递归调用),因此会出现意外错误。您需要将这两个合并在一起(这是很自然的)

}))


然后删除
单击
事件

谢谢。顺便说一句,在client/views/thisview.js中有这个可以吗?或者我应该把这个逻辑移到其他地方(只是为了最佳实践)我通常把与模板相关的所有内容放在一个文件中以便于控制。你是否将该js文件与视图/模板本身放在同一个文件夹中?取决于上下文。如果它在相同的路由器路径下,我将文件夹设置为路由器路径(路由器
/a/b
,然后设置文件夹
a/b
,并将该路由器的所有相关模板存储在该文件夹下。相同模板的
html
js
应作为相同的名称
Template.inquiry.helpers({

  //toggles 'thank you' on inquiry template
  showForm: function () {
    return Template.instance().showForm.get();
  },
});
Template.inquiry.events({
    'submit form': function(event, template) {

    event.preventDefault();
    var $form = template.$('#request-form');

    if ($form.valid()) {
        var name = event.target.name.value;
        var email = event.target.email.value;

        UserList.insert({
            name: name,
            email: email
        });

        template.showForm.set( false );

        Meteor.setTimeout( function() {
            template.showForm.set( true );
        }, 10000); // Reset after 10 seconds.
    }
}