2013-06-25 6 views
8

Im пытается создать окно поиска для фильтрации результатов моей возвращенной коллекции на клиенте.Meteor RangeError: превышен максимальный размер стека вызовов. on keypress event

Однако, когда я на самом деле пытаюсь выполнить поиск, я получаю вышеуказанную ошибку в консоли.

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 сообщений об ошибке, что кажется, как сво бесконечным но эти вопросы не были специфическими для метеорита, и я не знаю, изменит ли это? также, если существует бесконечный цикл, который я не могу найти.

любая помощь была бы признательна.

ответ

6

Изменение этого:

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

Для этого:

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

Я считаю, что вам просто нужно .val() на ссылки JQuery йот поля ввода. Кроме того, я бы рекомендовал использовать keyup для события для чего-то подобного.

Для получения результатов, как вы хотите, вы, вероятно, хотите использовать регулярное выражение. Вот что я использую в своем приложении.

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

    return searchResults; 
}; 
+2

Спасибо, что это был .val(); отсутствует – Moshe

+0

Спасибо за регулярное выражение, а также отлично работает. – Moshe

18

Эта ошибка возникает, когда вы передаете большой объект в качестве аргумента в свой метод. Для меня, например, в первый раз, когда я столкнулся с этой ошибкой, было, когда я передал Meteor.Collection в качестве аргумента: s. Я работал вокруг этого, передав имя коллекции как String, а затем используя eval() в Методах получения коллекции, на которой происходит.

Вывод: Всегда используйте строки, целые числа, малые массивы или действительно маленькие объекты в качестве аргументов для методов, вызванных обработчиками событий.

+0

Спасибо. Это помогло мне найти ошибку в Мезосфере, которая давала мне головные боли весь день. –

+1

Большое вам спасибо! Я попытался вернуть объект из Meteor.method, но он просто был слишком большим .. На самом деле я не мог понять это сам :) – zimt28

+0

Это и хорошие ответы!Я решил две проблемы здесь, на той же странице. – mwarren