我试图在SpaceBars中使用一个forEach,其中显示了可以为数组中的每个事物按下的一些按钮。但是,当我按下按钮时,它给了我这个错误:


  未捕获的RangeError:调用堆栈的最大大小超出了underscore.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}}


为什么会发生此错误,我该如何解决?

最佳答案

如果我们看the documentation about events


  该处理函数接收两个参数:event,一个具有
  有关事件的信息,以及template(该事件的模板实例)
  定义处理程序的模板。处理程序还会收到一些
  this中的其他上下文数据,具体取决于
  当前处理事件的元素。在模板中,元素的
  context是该元素所在的数据上下文,由
  阻止诸如#with#each之类的帮助器。


综上所述:流星中的事件不接收其数据上下文作为参数:它们接收事件对象和事件发生的模板实例。数据上下文存储在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);
}

09-11 17:38