我试图在SpaceBars中有一个forEach
,它显示了一些可以按下数组中每个东西的按钮。但是,当我按下按钮时,它会给我这个错误:
未捕获RangeError:最大调用堆栈大小超出下划线.js:1025
_。(匿名函数)@ underscore.js:1025
EJSON.clone @ ejson.js:475
(匿名函数)@ ejson.js:494
.each。 .forEach @ underscore.js:113
EJSON.clone @ ejson.js:493......一段时间以来......
.each。 .forEach @ underscore.js:113
EJSON.clone @ ejson.js:493
(匿名函数)@ ejson.js:494
.each。 .forEach @ underscore.js:113
EJSON.clone @ ejson.js:493
这是造成错误的findOne
:
"click .acceptFriend": function(requester){
currentUserId = Meteor.userId();
requesterUsername = requester;
requesterId = friendRequests.findOne({$and:[{target:currentUserId}, {requester:requesterUsername}]})._id;
Meteor.call("acceptRequest", requesterId, requester);
}
我知道它是friendRequests.findOne
,因为我已经在每一行上完成了控制台日志,这就是打破它的行。我尝试了几种不同的变体,但似乎在该上下文中friendRequests
集合上的任何类型的查找都会破坏它。模板的相关部分是:
{{#each getRequests}}
{{requester}} <button class='acceptFriend'>accept</button>
{{/each}}
为什么会发生这种错误?如何解决?
答案 0 :(得分:1)
如果我们查看the documentation about events:
处理程序函数接收两个参数:
event
,一个对象 有关该事件的信息,以及template
,一个模板实例 定义处理程序的模板。处理程序也收到一些this
中的其他上下文数据,具体取决于上下文 处理事件的当前元素。在模板中,元素的 context是发生该元素的数据上下文,由该元素设置 阻止助手,例如#with
和#each
。
总结: Meteor中的事件不接收他们的数据上下文作为参数:他们收到事件对象和模板实例。数据上下文存储在this
。
所以你应该做的是以下几点:
"click .acceptFriend": function(event, template){
currentUserId = Meteor.userId();
requesterUsername = this.requester;
requesterId = friendRequests.findOne({$and:[{target:currentUserId}, {requester:requesterUsername}]})._id;
Meteor.call("acceptRequest", requesterId, requesterUsername);
}