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

Mos*_*she 8 meteor

我试图建立一个搜索框来筛选我在客户端返回的集合的结果.

但是,当我实际尝试搜索时,我在控制台中收到上述错误.

RangeError: Maximum call stack size exceeded.
Run Code Online (Sandbox Code Playgroud)

这是我的代码.

<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>
Run Code Online (Sandbox Code Playgroud)

我在模块模板里面的搜索表单

<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>
Run Code Online (Sandbox Code Playgroud)

和我的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>
Run Code Online (Sandbox Code Playgroud)

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

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

并且表单助手会显示结果

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}});
 };
}
Run Code Online (Sandbox Code Playgroud)

我不知道是什么造成了这个错误,因为我能够在其他SO帖子上看到有关错误的信息似乎是一个无限循环但是那些不是流星特定的问题,我不知道这是否会产生影响?如果有一个无限循环我也找不到它.

任何帮助都会感激不尽.

sva*_*ssr 18

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

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

  • 如果你想传递一个对象(`.findOne`)也传递一个游标(`<collection> .find`),就会发生这种情况. (2认同)

use*_*382 6

改变这个:

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

对此:

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

我相信你只需要输入字段的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;
};
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你是.val(); 失踪 (2认同)