Meteor RangeError:超出最大调用堆栈大小。关于按键事件

时间:2013-06-25 19:58:17

标签: meteor

我正在尝试创建一个搜索框,以便在客户端中过滤掉我返回的集合的结果。

然而,当我真正尝试搜索时,我在控制台中收到了上述错误。

RangeError: Maximum call stack size exceeded.

这里是我的代码。

<body>
{{#isolate}}
 <header class="row-fluid">
  {{> modules}}
 </header>
{{/isolate}}

<div id="main" class="span11">
 {{#if currentUser}}

 {{#isolate}}
  {{> customers_list}}
 {{/isolate}}   

 {{#isolate}}
  {{> contacts_list}}
 {{/isolate}}

 {{/if}}
</div>
</body>

我在模块模板内的搜索表单

<template name="modules">
 {{templateLogger "modules"}}
  <ul id="module_list" class="nav">
 {{#each list}}
  <li>
   <a href="#" id="module_{{_id}}" module_id="{{_id}}" class="module">{{name}}</a>
  </li>
 {{/each}}
  <form><input type="text" id="search"></form>
</ul>

和我正在尝试过滤结果的customers_list模板

<template name="customers_list">
 <table class="table">
  <tr>
   <th>Name</th>
   <th>Address</th>
   <th>City</th>
   <th>State</th>
   <th>Zip</th>
   <th>Phone</th>
  </tr>

 {{#each record}}
  <tr>
   <td>{{name}}</td>
   <td>{{address}}</td>
   <td>{{city}}</td>
   <td>{{state}}</td>
   <td>{{zip}}</td>
   <td>{{phone}}</td>
  </tr>
 {{/each}}
 </table>
</template>

,这是搜索表单的事件处理程序

Template.modules.events({
 'keypress input#search': function (event) {
  Session.set("currentFilter", $('input#search'));
 }
});

并且表单助手会显示结果

Template.customers_list.record = function() {
 qry = Session.get("currentFilter") || "";
 if (qry != "") {
  return Customers.find({$or: [ {'name': qry}, {'address': qry}, {'city': qry}, {'state': qry} ] });
 } else {
  return Customers.find({competitor: null}, {sort: {name: 1}});
 };
}

我不知道导致这个错误是什么导致了这个错误,我能够在其他SO帖子上看到有关错误的信息似乎是一个无限循环但是那些不是流星特定的问题,我不知道是否会做出改变?如果有无限循环我也找不到它。

任何帮助都会感激不尽。

2 个答案:

答案 0 :(得分:18)

将大对象作为参数传递给方法时会发生此错误。对我来说,例如第一次我遇到这个错误,就是当我传递Meteor.Collection作为参数时:s。我通过将集合名称作为String传递,然后在方法中使用eval()来获取继续进行的集合。

结论:始终使用字符串,整数,小数组或非常小的对象作为从事件处理程序调用的方法的参数。

答案 1 :(得分:6)

更改此内容:

Template.modules.events({
 'keypress input#search': function (event) {
  Session.set("currentFilter", $('input#search'));
 }
});

To This:

Template.modules.events({
 'keyup input#search': function (event) {
  Session.set("currentFilter", $('input#search').val());
 }
});

我相信你只需要输入字段的jquery dom引用上的.val()。此外,我建议使用keyup为事件做这样的事情。

为了得到你想要的结果你可能想要使用正则表达式。这是我在我的应用程序中使用的内容。

Template.hudlies.found = function() {
  var searchVal = Session.get("searchFilter");
    if (searchVal != "") {
      var searchResults = Hudlies.find({ name: { $regex: '^.*' + searchVal + '.*', $options: 'i' } });
    };

  return searchResults;
};