2015-07-29 16 views
6

Provo a filtrare i dati usando |filter nella direttiva ng-repeat.La dimensione massima dello stack di chiamate ha superato in angularJS, quando provo ad usare | filter: searchText

ng-repeat="item in transactions |filter:searchText" 

transazioni è array con i dati, che assomiglia a questo:

{ 
$$hashKey: "object:666", 
amount: -50, 
card: "3158", 
catId: 0, 
dateTime: {month: 2, value: "2015-02-23T14:00:00"} 
details: "blabla", 
id: 2830, 
} 

Testo di ricerca - è un testo che immesso dall'utente.

È necessario filtrare i dati quando l'utente immette il testo, ma non funziona perché genera un'eccezione (Dimensione massima dello stack di chiamata superata). Funziona normalmente se sicuramente per scrivere quale tipo di campi si desidera utilizzare per filtrare i dati.

ng-repeat="item in transactions |filter:{amount:searchText}" 
+0

Sei sicuro che qualcosa all'interno della ripetizione non sia la causa e non il filtro? è un errore strano ottenere con un filtro incorporato. –

+0

Sì ... Hai ragione ( –

+0

@KostyaVyrodov sei riuscito a risolvere questo problema? –

risposta

1

Ho avuto questo stesso problema con un filtro molto semplice, ma filtrava su un array di oggetti che aveva un riferimento circolare. Non stavo facendo nessuna chiamata di funzione sul filtro: era solo il filtro incorporato su una semplice stringa.

Avevo due elenchi di oggetti con una relazione molti-a-molti, e una volta caricati da un $ resuscita li avevo impostati ciascuno con una proprietà che era una matrice di tutti gli oggetti nell'altra lista con cui avevano una relazione. Ho avuto un elenco di lavori che hanno tracciato il proprio elenco di attività e un elenco di attività con il proprio sottolista di lavori.

for (let job of service.jobs) 
{ 
    job.tasks = service.tasks.filter(t => t.jobid == job.id); 
} 

for (let task of service.tasks) 
{ 
    task.jobs = service.jobs.filter(j => j.taskid == task.id); 
} 

(Il rapporto era un po 'più complesso di questo, ma questo era il cuore di esso).

Stavo cercando di salvare i cicli associandoli frontalmente solo una volta piuttosto che ogni digest attraverso la pagina, ma ha creato un ciclo circolare che ha causato solo un problema una volta che ho provato a filtrarli. Probabilmente avrei potuto limitarlo per filtrare i campi non "task", ma in realtà voglio anche esaminarli. L'ho modificato in modo che la vista richiamasse semplicemente la funzione per trascinare gli oggetti correlati in linea nel modello.

<div ng-repeat="job in service.jobs | filter:jobFilterText"> <-- BOOM 
    <div ng-repeat="task in service.getTasksForJob(job.id)"> 
     {{ task.name }} 
    </div> 
</div> 

L'altra opzione ho considerato è stato la creazione di una copia degli oggetti da mettere nelle loro sub-array senza il riferimento di nuovo ai tipi di oggetti originali, ma fino a quando ho colpito un problema di prestazioni con la linea di legame preferisco la sua semplicità

Problemi correlati