2013-06-25 12 views
8

Sto cercando di creare una casella di ricerca per filtrare i risultati della mia collezione restituita nel client.Meteor RangeError: superata la dimensione massima dello stack di chiamate. sull'evento keypress

tuttavia, quando provo effettivamente a cercare, sto ricevendo l'errore sopra riportato nella console.

RangeError: Maximum call stack size exceeded. 

qui è uno sguardo al mio codice.

<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> 

il mio modulo di ricerca in all'interno del template moduli

<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> 

e il mio modello customers_list che sto cercando di filtrare i risultati

<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> 

e qui è la gestore di eventi per il modulo di ricerca

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

e la forma di supporto vengono visualizzati i risultati

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}}); 
}; 
} 

non ho idea di quello che la sta causando questo errore da quello che ero in grado di leggere su altri SO post su l'errore sembra proprio una infinita loop tuttavia quelle non erano domande specifiche per meteoriti e non so se questo farebbe la differenza? anche se c'è un ciclo infinito non riesco a trovarlo.

qualsiasi aiuto sarebbe grato.

risposta

6

La modifica di questo:

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

a questo:

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

Credo che basta il .VAL() sul riferimento jquery dom del campo di input. Inoltre, consiglierei di utilizzare la chiave per l'evento per qualcosa di simile.

Per ottenere i risultati desiderati, è consigliabile utilizzare un'espressione regolare. Ecco cosa sto usando nella mia app.

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

    return searchResults; 
}; 
+2

Grazie è stato il .val(); mancante – Moshe

+0

Grazie per la regex funziona anche alla grande. – Moshe

18

Questo errore si verifica quando si passa un oggetto di grandi dimensioni come argomento al metodo. Per esempio, per esempio la prima volta che ho riscontrato questo errore, è stato quando ho passato un argomento come Meteor.Collection: s. L'ho risolto passando il nome della raccolta come stringa e utilizzando quindi eval() nei metodi per ottenere la raccolta su cui procedere.

Conclusione: Utilizzare sempre stringhe, interi, piccoli array o oggetti veramente piccoli come argomenti per i metodi chiamati dai gestori di eventi.

+0

Grazie per questo. Mi ha aiutato a rintracciare un insetto in Mesosphere che mi dava mal di testa tutto il giorno. –

+1

Grazie mille! Ho provato a restituire un oggetto da un metodo Meteor.method ma era semplicemente troppo grande .. Davvero non avrei potuto immaginarlo da solo :) – zimt28

+0

Queste sono entrambe buone risposte!Ho risolto due problemi qui nella stessa pagina – mwarren

Problemi correlati