【问题标题】:Why is this findOne in a template event causing a call stack size error?为什么模板事件中的 findOne 会导致调用堆栈大小错误?
【发布时间】:2015-08-08 00:18:59
【问题描述】:

我试图在 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}}

为什么会出现这个错误,我该如何解决?

【问题讨论】:

    标签: javascript meteor spacebars


    【解决方案1】:

    如果我们查看the documentation about events:

    处理函数接收两个参数:event,一个对象 有关事件的信息,以及template,一个模板实例 定义处理程序的模板。处理程序还收到一些 this 中的附加上下文数据,具体取决于 处理事件的当前元素。在模板中,元素的 context 是该元素出现的数据上下文,由 阻止助手,例如 #with 和 #each。

    总结一下: Meteor 中的事件不接收它们的数据上下文作为参数:它们接收 event 对象和 模板实例 事件发生的地方。数据上下文存储在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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2017-08-03
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多