Javascript 未捕获范围错误:超过Meteor.js表单的最大调用堆栈大小
我有一个正在提交的表单(并使用reactiveVar在提交时更改视图中的输出)。每当我成功提交时,我都会遇到这样一个不祥的错误: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
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.
}
}